shell脚本基础学习

 1.什么是shell ?什么是脚本?

       
脚本:能够运行里面记录程序的文本

 2.shell脚本的意义

1.记录命令执行的过程和执行逻辑,以便以后重复执行 (重复)
2.脚本可以批量处理主机 (批量)
#!/bin/bash
touch /root/Desktop/zzz{1..10}
3.脚本可以定时处理主机 (定时)

3.如何创建shell脚本

shell是解释型语言 

#!/bin/bash                 //幻数
vim自动添加脚本首部
set nu ts=2 sw=2 ai et

autocmd BufNewFile *.sh,*.script call WESTOSTITLE()
func WESTOSTITLE()
call append(0,"###############################################")
call append(1,"# Author: Zzz")
call append(2,"# Version: ")
call append(3,"# Create_Time: ".strftime("%Y/%m/%d"))
call append(4,"# Mail: lee@westos.org")
call append(5,"# Info: ")
call append(6,"# ")
call append(7,"################################################")
call append(8,"")
call append(9,"#!/bin/bash")
endfunc

3.如何执行shell脚本

1.手动在环境中开启指定解释器
sh script.sh         (开启一个子shell,没有权限时直接调用)
[root@localhost Desktop]# sh text.sh

2.直接在当前环境中运行shell中的指令不开启新的shell
source text.sh        (在当前shell里直接运行)
. text.sh
[root@localhost Desktop]# source text.sh   

[root@localhost Desktop]#. text.sh
3.开启脚本中指定的shell并使用此shell环境运行脚本中的指令
chmod +x text.sh
/xxx/xxx/text.sh
./script.sh         (开启一个子shell)
[root@localhost Desktop]# chmod +x text.sh
[root@localhost Desktop]# ./text.sh   

4.如何对脚本进行调试

sh -x /mnt/westos.sh
[root@localhost Desktop]# sh -x text.sh 
+ data    //指令
text.sh: line 11: data: command not found    //结果
+ cal    //指令
    December 2021   
Su Mo Tu We Th Fr Sa
          1  2  3  4
 5  6  7  8  9 10 11        //结果
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31   
                    
+ cat    //指令

5.shell脚本中的高频使用命令

1.cut

cut     -d :      //指定:为分隔符
        -f        //指定显示的列 5第五列| 3,5 3和5列|3-5 3到5列|5- 第五列以后|-5 到第五列
        -c        //指定截取的字符(数字用法同-f)
[root@localhost Desktop]# cut -d : -f 1,7 passwd     //以:为分隔符,截取第一列和第七列
root:/bin/bash

[root@localhost Desktop]# cut -d : -f 3- passwd      //以:为分隔符,截取第三列到最后一列
0:0:root:/root:/bin/bash

[root@localhost Desktop]# cut -d : -f -3 passwd      //以:为分隔符,截取第一列到最后三列
root:x:0

[root@localhost Desktop]# cut -c 2-4 passwd          //截取2到4的字符
oot

[root@localhost Desktop]# cut -d : -f 1 /etc/passwd | wc -l    //统计有多少行
55

2.sort

sort    -n ##纯数字排序
        -r ##倒叙
        -u ##去掉重复
        -o ##输出到指定文件
        -t ##指定分隔符
        -k ##指定排序的列
[root@localhost Desktop]# sort -nu zzz -o aaa    //指定输出到aaa
[root@localhost Desktop]# cat aaa 

1
2
3
4

如果有多列,用分隔符之后再用-k指定列

[root@localhost Desktop]# sort -n -t : -k 2 aaa     //以第二列

20:1
30:2
12:5
1:5
15:7
2:7
11:13
10:14

3.uniq(处理冗余数据)

uniq    -c #合并重复并统计重复个数
        -d #显示重复的行
        -u #显示唯一的行

按数字排序,合并重复的部分,并且显示个数

 显示重复的行

 显示唯一的行

4.test

test = []     ##[] 就相当于test命令
"test $a = $b" = [ "$a" = "$b" ]

test数字对比

=
!=
-eq ##等于
-ne ##不等于
-le ##小于等于
-lt ##小于
-ge ##大于等于
-gt ##大于
test的条件关系
-a ##并且
-o ##或者

test对空的判定
-n ##nozero 判定内容不为空
-z ##zero 判定内容为空

test对于文件的判定
-ef ##文件节点号是否一致(硬链)
-nt ##文件1是不是比文件2新
-ot ##文件1是不是比文件2老
-d ##目录
-S ##套结字
-L ##软连接
-e ##存在
-f ##普通文件
-b ##快设备
-c ##字符设备

 比较文件新旧

 文件节点号是否一致(硬链)

5.&& ||

&&    符合条件作动作

||    不符合条件作动作

6.grep [Globally search a Regular Expression and Print]

grep    //基本表达式
grep -E = egrep    //拓展表达式
[root@localhost Desktop]# grep root passwd     //基本表达式
root:x:0:0:root:/root:/bin/bash
root:test:test
chroot:test:tses
operator:x:11:0:operator:/root:/sbin/nologin


[root@localhost Desktop]# grep "root|bash" passwd     //不识别

[root@localhost Desktop]# egrep "root|bash" passwd     //拓展表达式
root:x:0:0:root:/root:/bin/bash
root:test:test
chroot:test:tses
operator:x:11:0:operator:/root:/sbin/nologin


[root@localhost Desktop]# grep -E "root|bash" passwd     //拓展表达式
root:x:0:0:root:/root:/bin/bash
root:test:test
chroot:test:tses
operator:x:11:0:operator:/root:/sbin/nologin

grep 格式

grep 匹配条件 处理文件
grep root passwd     #过滤root关键字
grep -i root passwd     ##后略大小写
grep -E "\<root" passwd     ##root字符之前不能有字符
grep -E "root\>" passwd     ##root字符之后不能有字符
grep -数字  ##显示过滤行以及上面几行和下面几行
grep -n    ##显示匹配的行所在行号
grep -A    ##显示过滤行以及下面几行
grep -B    ##显示过滤行以及上面几行
grep -v    ##反向过滤
[root@localhost Desktop]# grep -i root passwd     //过滤大小写-i
root:x:0:0:root:/root:/bin/bash
root:test:test
chroot:test:tses
ROOT
operator:x:11:0:operator:/root:/sbin/nologin


[root@localhost Desktop]# grep -E "\<root" passwd     //root前面没有字符 \<
root:x:0:0:root:/root:/bin/bash
root:test:test
operator:x:11:0:operator:/root:/sbin/nologin


[root@localhost Desktop]# grep -E "root\>" passwd     //root后面没有字符 \>
root:x:0:0:root:/root:/bin/bash
root:test:test
chroot:test:tses
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost Desktop]# grep -E "\<root\>" passwd     //root前后都没有字符\< >\
root:x:0:0:root:/root:/bin/bash
root:test:test
operator:x:11:0:operator:/root:/sbin/nologin


[root@localhost Desktop]# grep chroot passwd 
chroot:test:tses
[root@localhost Desktop]# grep -n chroot passwd     //显示行号
10:chroot:test:tses


[root@localhost Desktop]# grep -n -A2 chroot passwd     //显示本行及下面两行
10:chroot:test:tses
11-ROOT
12-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin


[root@localhost Desktop]# grep -n -B2 chroot passwd     //显示本行及上面两行
8-halt:x:7:0:halt:/sbin:/sbin/halt
9-root:test:test
10:chroot:test:tses


[root@localhost Desktop]# grep  chroot passwd -v    //反向搜索
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
root:test:test
ROOT
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin


grep字符数量匹配规则

^root    ##以root开有
root$    ##以root结尾
w....s    ##w开头s结尾中间4个任意字符
.....s    ##s结尾前面5个任意字符
*    ##字符出现任意
?    ##0到1次
+    ##1次到任意次
{n}    ##n此
{m,n}    ##m到n次
{0,n}    ##0-n次
{,n}    ##0-n次
{m,}    ##最少m次
(lee){2}    ##lee字符串出现2次
[root@localhost Desktop]# cat ws
ws
was
waas
waaas
waaaas
wababas

[root@localhost Desktop]# grep ws ws 
ws
[root@localhost Desktop]# grep w.s ws 
was
[root@localhost Desktop]# grep w..s ws 
waas
[root@localhost Desktop]# grep w...s ws 
waaas
[root@localhost Desktop]# grep w.*s ws 
ws
was
waas
waaas
waaaas
wababas
[root@localhost Desktop]# grep -E "w.?s" ws     //0-1
ws
was
[root@localhost Desktop]# grep -E "w.+s" ws     //1到任意次
was
waas
waaas
waaaas
wababas
[root@localhost Desktop]# grep -E "w.{2}s" ws     //2次
waas
[root@localhost Desktop]# grep -E "w.{2,}s" ws     //至少两次
waas
waaas
waaaas
wababas
[root@localhost Desktop]# grep -E "w.{2,4}s" ws     //2-4次
waas
waaas
waaaas

[root@localhost Desktop]# grep -E "w(ab){3,}s" ws     //字符串ab出现至少3次
wabababs

7.sed(把文件的所有内容复制到内存里面,在逐行进行处理)

命令格式:

sed 参数 命令 处理对象
sed 参数 处理对象 -f 处理规则文件

 

对字符的处理

p        ##显示

 
sed -n 5p westos ##显示第五行
sed -n 3,5p westos ##显示3到5行
sed -ne "3p;5p westos ##显示3和5行
sed -ne 1,5p westos ##1-5行
sed -ne '5,$p'
westos ##5到最后以行
sed -n '/^#/p' fstab ##显示以#开头的行
[root@localhost Desktop]# sed -n '5p' fstab     //第五行
#5

[root@localhost Desktop]# sed -n '3,5p' fstab     //三到五行
#3  /etc/fstab
#4  Created by anaconda on Sun Nov 28 22:36:44 2021
#5


[root@localhost Desktop]# sed -n '3p;5p' fstab     //三行和五行
#3  /etc/fstab
#5
[root@localhost Desktop]# sed -ne '3p;5p' fstab 
#3  /etc/fstab
#5
[root@localhost Desktop]# sed -ne '5,$p' fstab     //五到最后一行
#5
#6 Accessible filesystems, by reference, are maintained under '/dev/disk/'.
...
UUID=ce95169b-2859-464b-badd-12993517c57a swap                    swap    defaults        0 0


[root@localhost Desktop]# sed -n '/^#/p' fstab     //以#号开头的行
#2
#3  /etc/fstab
...


[root@localhost Desktop]# sed -n '/^#/!p' fstab     //不以#号开头的行
 1
UUID=e1a70684-8a88-4309-87c9-12f668eadb63 /                       xfs     defaults        0 0
UUID=e852be46-1848-4494-8b86-40bf395c9225 /boot                   xfs     defaults        0 0
UUID=ce95169b-2859-464b-badd-12993517c57a swap                    swap    defaults        0 0
[root@localhost Desktop]# sed -n '/^#/!p' fstab | sed -n '/UUID/!p'//不以#号且不以UUID开头
 1

d         ##删除

sed 5d westos    ##删除第五行
sed '/^#/d' fstab ##把#开头的行删除
sed '/^UUID/!d' fstab ##除了UUID以外的行都删除
sed -e '5,$d' westos
[root@localhost Desktop]# sed  '/#/d' fstab | sed '/^$/d' //删除#开头的行和空开头的行
 1
UUID=e1a70684-8a88-4309-87c9-12f668eadb63 /                       xfs     defaults        0 0
UUID=e852be46-1848-4494-8b86-40bf395c9225 /boot                   xfs     defaults        0 0
UUID=ce95169b-2859-464b-badd-12993517c57a swap                    swap    defaults        0 0

a         ##添加

sed -e '$a hello world' fstab
sed -e '$a hello\nworld' fstab
sed -e '/^#/a hello world' fstab

c         ##替换

sed -e '/^#/c hello world' fstab
sed '5chello world' westos

w         ##把符合的行写到指定文件中

sed '/^UUID/w westofile' westos ##把westos中UUID开头的行写入westosfile中

i        ##插入

sed '5ihello westos' westos

r         ##整合文件

 
sed '5r haha' westos

sed 字符替换

sed 's/要被取代的字串/新的字串/g'
sed 's/:/###/g' westos
sed 's/:/###/' westos
sed 's/:/###/g' westos
sed '1,5s/:/###/g' westos
sed '1s/:/###/g' westos
sed '1s/:/###/g;5s/:/###/g' westos
sed '/lp/,/shutdown/s/:/###/g' westos
sed 's/\//####/g' westos
sed 's@/@####@g' westos
sed 's@/@####@g' -i westos    //把sed处理的内容保存到westos文件中

8.awk

awk -F 分隔符 BEGIN{}{}END{} FILENAME

NR #行数
NF #列数

FILENAME #文件名称本身
westos #westos变量值
“westos” #westos字符串

/bash$/    #条件
/条件1|条件2/    #条件1或者条件2
/条件1/||/条件2/    #条件1或者条件2
/条件1/&&/条件2/    #条件1并且条件2

$0    #所有的列
$1    #第一列
$2    #第二列
$3    #第三列

#/etc/passwd文件的第六列没有home关键字并且以bash结尾的行
awk -F : '$6!~/home/&&/bash$/{print}' /etc/passwd
[root@localhost Desktop]# awk -F : 'BEGIN{1+1}'
[root@localhost Desktop]# awk -F : 'BEGIN{print 1+1}'
2
[root@localhost Desktop]# awk -F : 'BEGIN{print 0.1+1}'    //可以计算小数
1.1
[root@localhost Desktop]# awk -F : 'BEGIN{print 0.1+5/2}'
2.6
[root@localhost Desktop]# awk -F : 'BEGIN{print start}'    //视为变量

[root@localhost Desktop]# awk -F : 'BEGIN{print "start"}'    //加“”视为字符串
start
[root@localhost Desktop]# awk -F : 'BEGIN{print "start"}{print "username:" $1}END{print "end"}' passwd 
start
username:root
username:bin
username:daemon
username:adm
username:lp
username:sync
username:shutdown
username:halt
username:mail
username:operator                //显示第一行
username:games
username:ftp
username:nobody
username:dbus
username:systemd-coredump
username:systemd-resolve
username:tss
username:polkitd
username:geoclue
end

[root@localhost Desktop]# awk -F : '{print NR}' passwd 
1
2
3
4
.....
[root@localhost Desktop]# awk -F : '{print NF}' passwd 
7
7
7
7
.....

[root@localhost Desktop]# awk -F : 'NR==2{print $0}' passwd     //显示第二行
bin:x:1:1:bin:/bin:/sbin/nologin

[root@localhost Desktop]# awk -F : '/bash/{print $0}' passwd     //显示含义bash的
root:x:0:0:root:/root:/bin/bash

[root@localhost Desktop]# awk -F : '/bash|root/{print $0}' passwd     //显示bash和root的
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

[root@localhost Desktop]# awk -F : '/bash/||/root/{print $0}' passwd   //显示bash或root的
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

[root@localhost Desktop]# awk -F : '/bash/&&/root/{print $0}' passwd   //显示bash且root的 
root:x:0:0:root:/root:/bin/bash
[root@localhost Desktop]# awk -F : '$6~/var/{print $0}' passwd 
    //显示第六列带有var的

[root@localhost Desktop]# awk -F : '$6!~/var/{print $0}' passwd 
    //显示第六列不带有var的
[root@localhost Desktop]# ls | awk '/^p/{print $0}'
passwd
[root@localhost Desktop]# ls | awk '/^p/{print " ls -l " $0}' 
 ls -l passwd
[root@localhost Desktop]# ls | awk '/^p/{print " ls -l " $0}' | bash
-rw-r--r--. 1 root root 920 Dec 14 18:16 passwd

[root@localhost Desktop]# ls | awk '/^p/{print $0}' | cat
passwd
[root@localhost Desktop]# ls | awk '/^p/{print $0}' | xargs cat   
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin         //加一个xargs告诉cat里面是操作对象不是要显示的内容
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
.....

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值