Shell 编程第五章三剑客grep 、sed 、awk
⽂章⽬录
⼀、shell 编程-grep
grep命令是Globally search a Regular Expression and Print的缩写,表⽰进⾏全局的正则匹配并进⾏打印。grep的相关扩展命令egrep其中egrep⽀持更多的正则匹配。
语法:常⽤选项
参数⽤法
-v 取反,表⽰反向查
-i 忽略⼤⼩写-r -[ r | R ]表⽰递归查询
-w 按单词搜索-o 打印匹配关键字-c 统计匹配到的次数
-n 显⽰⾏号-r 逐层遍历⽬录查-A 显⽰匹配⾏及后⾯多少⾏-B 显⽰匹配⾏及前⾯多少⾏-C 显⽰匹配⾏前后多少⾏-l 只列出匹配的⽂件名-L 列出不匹配的⽂件名
-e 使⽤正则匹配-E 使⽤扩展正则匹配^key 以关键字开头key$以关键字结尾^$匹配空⾏
-color=auto
可以将到的关键字加上颜⾊的显⽰
实例
grep [选项] '关键字' ⽂件名
1
⼆、shell 编程-sed
1、简介
sed:stream editor(流编辑器)的缩写是⼀种在线⾮交互式编辑器,它⼀次处理⼀⾏内容。这样不断重复,直到⽂件末尾。Sed主要⽤来⾃动编辑⼀个或多个⽂件;简化对⽂件的反复操作;编写转换程序等由于sed把每⼀⾏都存在临时缓冲区中,对这个副本进⾏编辑,所以不会直接修改原⽂件
语法2
shell创建文件并写入内容、⼯作流程
⾸先sed读取⽂件中的⼀⾏内容,把其保存在⼀个临时缓存区中(也称为模式空间)然后根据需求处理临时缓冲区中的⾏,完成后把该⾏发送到屏幕上
2、常⽤选项
参数⽤法-e 匹配多个命令-f 指定sed脚本的⽂件名
-i sed默认是不会修改⽂件内容的,-i会直接修改⽂件内容
-n
sed默认输出全部内容,-n是只输出匹配到的内容,这个选项⼀般只⽤于查看
实例
$ grep '^#' /etc /ssh /ssh_config      #过滤以#号开头的⾏$ grep -v '^#' /etc /ssh /ssh_config    #-v :取反,表⽰反向查$ grep 'sendenv' /etc /ssh /ssh_config
$ grep -i 'sendenv' /etc /ssh /ssh_config  #-i 忽略⼤⼩写
$ grep  'bash' /opt /test /            #过滤某个⽬录下⾯带有bash 的⾏$ grep  -r 'bash' /opt /test /          #-[r|R]表⽰递归查询
123456
sed -r '匹配内容'  file_name
-r:⽀持扩展正则,在实际使⽤的时候,都会加上 -r 参数,即使没有⽤的扩展正则也不会有任何影响。
12
3、sed 中的编辑命令(以下所有的动作都要在单引号⾥)
参数⽤法
a 追加 向匹配⾏后⾯插⼊内容c 更改 更改匹配⾏的内容i
插⼊ 向匹配⾏前插⼊内容
⽰例⽂件
[root@localhost ~]#
MA Daggett, 341 King Road, Plymouth MA Alice Ford, 22 East Broadway, Richmond VA MA Thomas, 11345 Oak Bridge Road, Tulsa OK Terry Kalkas, 402 Ma Road, mA Falls PA Eric Adams, 20 Post Road, Sudbury mA Hubert Sims, 328A Brook Road, Roanoke VA Amy Wilde, 334 Ma Pkwy, Mountain View CA Sal Carpenter, 73 MA Street, Boston MA
1.搜索每⼀⾏匹配到MA 的将第⼀个替换为Massachusetts:[root@localhost ~]# sed -r 's/MA/Massachusetts/' s:----查
2.搜索每⼀⾏,到所有的MA 字符,进⾏全局替换为Massachusetts [root@localhost ~]# sed -r 's/MA/Massachusetts/g'
3.搜索每⼀⾏,到所有的MA 字符,进⾏全局替换为Massachusetts 同时忽略⼤⼩写[root@localhost ~]# sed -r 's/MA/Massachusetts/gi' -i:忽略⼤⼩写
4.-n  静默输出(不打印默认输出)
[root@localhost ~]# sed  -r -n 's/MA/Massachusetts/'
5.-e  使⽤多重指令:给予sed 多个命令的时候需要-e 选项
$ sed  -r -e 's/MA/Massachusetts/' -e 's/PA/Pennsylvania/'
6.-f  使⽤脚本⽂件:当有多个要编辑的项⽬时,可以将编辑命令放进⼀个脚本⾥,再使⽤sed 搭配-f 选项 -f <script ⽂件> 以选项中指定的script ⽂件来处理输⼊的⽂本⽂件。[root@localhost ~]# vim s.sed s/MA/Massachusetts/ s/PA/Pennsylvania/ s/CA/California/ s/VA/Virginia/ s/OK/Oklahoma/
[root@localhost ~]# sed -f s. 保存输出:
[root@localhost ~]# sed -f s. >
7.-i    会使得sed ⽤修改后的数据替换原⽂件
[root@localhost ~]# sed -r -i 's/MA/Massachusetts/gi' 由于在使⽤ -i 参数时⽐较危险
我们在使⽤i 参数时在后⾯加上.bak 就会产⽣⼀个备份的⽂件,以防后悔[root@localhost ~]# sed -r -i.
bak 's/root/ROOT/' passwd
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
d 删除,删除选择的⾏。
s 替换指定字符,⼀般格式为s///g p 打印 打印出匹配的内容,通常与-n选项和⽤
=⽤来打印被匹配的⾏的⾏号n 读取下⼀⾏,遇到n时会⾃动跳⼊下⼀⾏
r,w
读和写编辑命令,r⽤于将内容读⼊⽂件,w⽤于将匹配内容写⼊到⽂件
参数⽤法
增删改查实例4、 地址(定址)
前提:vim a .txt
root:x:0:0:root:/root:/bin /bash bin:x:1:1:bin:/bin:/sbin /nologin
daemon:x:2:2:daemon:/sbin:/sbin /nologin adm:x:3:4:adm:/var /adm:/sbin /nologin lp :x:4:7:lp :/var /spool /lpd:/sbin /nologin 298374837483172.16.0.25410.1.1.1
对⽂件进⾏增、删、改、查操作 p 打印⽂件内容
sed ''  a .txt                        对⽂件什么都不做
sed -n 'p'  a .txt                    打印每⼀⾏,并取消默认输出sed -n '1p'  a .txt                    打印第1⾏sed -n '2p'  a .txt                    打印第2⾏sed -n '1,5p'  a .txt                  打印1到5⾏sed -n '$p' a .txt                    打印最后1⾏ 增加⽂件内容
i  在当前⾏上⾯插⼊⽂本
sed -r '2i\222222' a .txt              在第2⾏插⼊a  在当前⾏下⾯插⼊⽂本
sed '$a99999' a .txt              ⽂件最后⼀⾏下⾯增加内容sed 'a99999' a .txt                ⽂件每⾏下⾯增加内容sed '5a99999' a .txt              ⽂件第5⾏下⾯增加内容sed '$i99999' a .txt              ⽂件最后⼀⾏上⼀⾏增加内容sed 'i99999' a .txt                ⽂件每⾏上⼀⾏增加内容sed '6i99999' a .txt              ⽂件第6⾏上⼀⾏增加内容sed '/^adm/ihello'                以adm 开头⾏的上⼀⾏插⼊内容 c 替换指定的整⾏内容
sed '5chello world' a .txt      替换⽂件第5⾏内容sed 'chello world' a .txt        替换⽂件所有内容
sed '1,5chello world' a .txt    替换⽂件1到5号内容为hello world sed '/^daemon/c888888' a .txt    替换以user01开头的⾏ d 删除⽂件内容
sed '1d' a .txt                  删除⽂件第1⾏sed '1,5d' a .txt                删除⽂件1到5⾏sed '$d' a .txt                  删除⽂件最后⼀⾏sed '1~2d' a .txt                删除奇数⾏,间隔两⾏删除sed '0~2d' a .txt                删除偶数⾏,从0开始间隔2⾏删除
123456789101112131415161718192021222324252627282930313233343536373839404142434445
地址⽤于决定对哪些 ⾏ 进⾏编辑。地址形式可以是数字、正则表达式或⼆者的结合。如果没有指定地址,sed将处理输⼊⽂件中的所有⾏。5、常规操作
# head /etc/passwd > passwd  #⽣成测试⽂件# sed -r '1d' passwd  #d:表⽰删除-- 删除⽂件的第1⾏
bin:x:1:1:bin:/bin:/sbin /nologin
daemon:x:2:2:daemon:/sbin:/sbin /nologin
# sed -r '1,2d' passwd #删除⽂件的第1-2⾏ daemon:x:2:2:daemon:/sbin:/sbin/nologin # cat passwd
root:x:0:0:root:/root:/bin /bash bin:x:1:1:bin:/bin:/sbin /nologin
daemon:x:2:2:daemon:/sbin:/sbin /nologin ...
# sed -r '2,$d' passwd    #删除第2⾏到最后⼀⾏
root:x:0:0:root:/root:/bin /bash
# sed -r '/^root/d' passwd    #匹配到root 开头的⾏,删除此⾏
bin:x:1:1:bin:/bin:/sbin /nologin
daemon:x:2:2:daemon:/sbin:/sbin /nologin
# sed -r '/root/d' passwd  #含有root 的⾏都删除
bin:x:1:1:bin:/bin:/sbin /nologin
daemon:x:2:2:daemon:/sbin:/sbin /nologin
# sed -r '/bash/,3d' passwd  #匹配到bash ⾏,从此⾏到第3⾏删除
adm:x:3:4:adm:/var /adm:/sbin /nologin
# cat -n passwd
1 root:x:0:0:root:/root:/bin /bash
2 bin:x:1:1:bin:/bin:/sbin /nologin
3 daemon:x:2:2:daemon:/sbin:/sbin /nologin
4 adm:x:3:4:adm:/var /adm:/sbin /nologin
5 lp :x:4:7:lp :/var /spool /lpd:/sbin /nologin
6 sync:x:5:0:sync:/sbin:/bin /sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin /shutdown    8 halt:x:7:0:halt:/sbin:/sbin /halt
9 mail:x:8:12:mail:/var /spool /mail:/sbin /nologin    10 operator:x:11:0:operator:/root:/sbin /nologin
# sed -r '1~2d' passwd  #删除奇数⾏,间隔两⾏删除
bin:x:1:1:bin:/bin:/sbin /nologin adm:x:3:4:adm:/var /adm:/sbin /nologin sync:x:5:0:sync:/sbin:/bin /sync halt:x:7:0:halt:/sbin:/sbin /halt
operator:x:11:0:operator:/root:/sbin /nologin
# sed '0~2d' passwd    #删除偶数⾏,从0开始间隔2⾏删除
passwd root:x:0:0:root:/root:/bin /bash  daemon:x:2:2:daemon:/sbin:/sbin /nologin
lp :x:4:7:lp :/var /spool /lpd:/sbin /nologin shutdown:x:6:0:shutdown:/sbin:/sbin /shutdown mail:x:8:12:mail:/var /spool /mail:/sbin /nologin
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。