grep文本过滤命令
grep用于shell脚本时,如果模板搜索成功返回0,不成功返回1,搜索文件不存在返回2
名称 | 方法 |
---|---|
搜索file中的xxx | grep xxx file |
只输出匹配行的计数 | grep -c xxx file |
不区分大 小写(只适用于单字符) | grep -i xxx file |
查询多文件时不显示文件名 | grep -h xxx file |
查询多文件时只输出包含匹配字符的文件名 | grep -I xxx file |
显示匹配行及行号 | grep -n xxx file |
不显示不存在或无匹配文本的错误信息 | grep -s xxx file |
显示不包含匹配文本的所有行 | grep -v xxx file |
##过滤passwd中的root——grep root passwd
[root@shell_grep mnt]# cp -p /etc/passwd .
cp: overwrite ‘./passwd’? n
[root@shell_grep mnt]# grep root passwd
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin
root ROOT njvlksdvmROOT SKDVMS root
ROOT SDKLJNVCS root
ROOT root sdvkn ROOT root
搜索全文中的root,grep属于贪婪模式的搜索和匹配,只要行中有root出现,它就会打印匹配的行,除非指定什么开头,什么结尾
##-E,grep的扩展模式:可以一次性加两个条件——grep -E
[root@shell_grep mnt]# grep -E “root|ROOT” passwd
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin
root ROOT njvlksdvmROOT SKDVMS root
ROOT SDKLJNVCS root
ROOT root sdvkn ROOT root
##忽略大小写过滤——grep -i
[root@shell_grep mnt]# grep -i root passwd
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin
root ROOT njvlksdvmROOT SKDVMS root
ROOT SDKLJNVCS root
ROOT root sdvkn ROOT root
##过滤出以root开头的行——grep ^xxx
[root@shell_grep mnt]# grep ^root passwd
root❌0:0:root:/root:/bin/bash
root ROOT njvlksdvmROOT SKDVMS root
##过滤出以root结尾的行——grep xxx$
[root@shell_grep mnt]# grep root$ passwd
root ROOT njvlksdvmROOT SKDVMS root
ROOT SDKLJNVCS root
ROOT root sdvkn ROOT root
##过滤出以root开头和结尾的——grep -E “^xxx|xxx$“
[root@shell_grep mnt]# grep -E “^root|root$” passwd
root❌0:0:root:/root:/bin/bash
root ROOT njvlksdvmROOT SKDVMS root
ROOT SDKLJNVCS root
ROOT root sdvkn ROOT root
##-v表示取反——过滤出不以root开头和结尾的
[root@shell_grep mnt]# grep -Ev “^root|root$” passwd
bin❌1:1:bin:/bin:/sbin/nologin
daemon❌2:2:daemon:/sbin:/sbin/nologin
adm❌3:4:adm:/var/adm:/sbin/nologin
lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
sync❌5:0:sync:/sbin:/bin/sync
省略
##过滤出root居中的
[root@shell_grep mnt]# grep -Evi “^root|root$” passwd | grep root
[root@shell_grep mnt]# grep -Evi “^root|root$” passwd | grep root
operator❌11:0:operator:/root:/sbin/nologin
##过滤出以root开头和结尾的,且排序
[root@shell_grep mnt]# grep -Ein “^root|rootKaTeX parse error: Expected 'EOF', got '#' at position 158: …shell_grep mnt]#̲ grep -Ein "^ro…” passwd
1:root❌0:0:root:/root:/bin/bash
40:root ROOT njvlksdvmROOT SKDVMS root
41:ROOT SDKLJNVCS root
42:ROOT root sdvkn ROOT root
##过滤出ROOT所在行及其前一行
[root@shell_grep mnt]# grep root passwd -B 1
root:x:0:0:root:/root:/bin/bash
--
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
--
tcpdump:x:72:72::/:/sbin/nologin
root ROOT njvlksdvmROOT SKDVMS root
ROOT SDKLJNVCS root
ROOT root sdvkn ROOT root
##过滤出ROOT所在行及其后一行
[root@shell_grep mnt]# grep root passwd -A 1
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
--
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
--
root ROOT njvlksdvmROOT SKDVMS root
ROOT SDKLJNVCS root
ROOT root sdvkn ROOT root
##过滤出ROOT所在行及其前后2行
[root@shell_grep mnt]# grep root passwd -2
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
--
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
--
gnome-initial-setup:x:993:991::/run/gnome-initial-setup/:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
root ROOT njvlksdvmROOT SKDVMS root
ROOT SDKLJNVCS root
ROOT root sdvkn ROOT root
grep中的正则表达式
名称 | 方法 |
---|---|
忽略正则表达式中特殊字符的原有含义 | \ |
匹配正则表达式的开始行 | ^ |
匹配正则表达式的结束行 | $ |
从匹配正则表达 式的行开始 | \< |
到匹配正则表达式的行结束 | >\ |
单个字符,如[A]即A符合要求 | [ ] |
范围,如[A-Z],即A、B、C一直到Z都符合要求 | [ - ] |
所有的单个字符 | ?: |
有字符,长度可以为0 | *: |
##正则表达式的表现形式
匹配x后面只要大于等于有两位字符的 grep -E "x.." file
匹配x后面只有两位的 grep -E "x..\>" file
匹配x后面仅有两位的,前面没有后面也没有 grep -E "\<x..\>" file
匹配y前面只要大于等于有两位字符的 grep -E "..y" file
匹配y前面只有两位字符的 grep -E "\<..y" file
##匹配x后面只要大于等于有两位字符的——grep -E “x…” file
[root@shell_grep mnt]# vim file
[root@shell_grep mnt]# cat file
x
xxy
xxxy
xxxxy
xxxxxy
xxxxxxy
[root@shell_grep mnt]# grep -E “x…” file
xxy
xxxy
xxxxy
xxxxxy
xxxxxxy
##匹配x后面只有两位的——grep -E “x…>” file
[root@shell_grep mnt]# grep -E “x…>” file
xxy
xxxy
xxxxy
xxxxxy
xxxxxxy
##匹配x后面仅有两位的,前面没有后面也没有——grep -E “<x…>” file
[root@shell_grep mnt]# grep -E “<x…>” file
xxy
##匹配y前面只要大于等于有两位字符的——grep -E “…y” file
[root@shell_grep mnt]# grep -E “…y” file
xxy
xxxy
xxxxy
xxxxxy
xxxxxxy
##匹配y前面只有两位字符的——grep -E “<…y” file
[root@shell_grep mnt]# grep -E “<…y” file
xxy
##grep中字符的匹配次数设定
字符出现0-任意次 *
字符出现0-1次 ?
字符出现1-任意次 +
字符出现n次 {n}
最少出现m次,最多出现n次 {m,n}
字符出现0-n次 {0,n}
字符出现至少 m 次 {m,}
关键字出现 n 次 (xy){n}xy
关键字之间匹配任意字符 .*
##x出现0到任意次
[root@shell_grep mnt]# grep -E x*y file
xxy
xxxy
xxxxy
xxxxxy
xxxxxxy
##x出现0到1次
[root@shell_grep mnt]# grep -E x?y file
xxy
xxxy
xxxxy
xxxxxy
xxxxxxy
##x出现1到任意次且后面有y
[root@shell_grep mnt]# grep -E x+y file
xxy
xxxy
xxxxy
xxxxxy
xxxxxxy
##x开头y 出现一次的字符
[root@shell_grep mnt]# grep -E “<x{1}y” file
xy
xyxyxyxy
##x开头y结尾 出现一次的字符
[root@shell_grep mnt]# grep -E “<x{1}y>” file
xy
##x开头,y结尾 x最多出现两次的
[root@shell_grep mnt]# grep -E “<x{,2}y>” file
y
xy
xxy
##x开头,y结尾 x至少出现两次的
[root@shell_grep mnt]# grep -E “<x{2,}y>” file
xxy
xxxy
xxxxy
xxxxxy
xxxxxxy
sed行编辑器(以行为单位)
##什么是sed
SED是一项Linux指令,功能同awk类似,差别在于,sed简单,对列处理的功能要差一些,awk的功能复杂,对列处理的功能比较强,sed用来操作纯 ASCII 码的文本 处理时 , 把当前处理的行存储在临时缓冲区中 , 称为“模式空间” (pattern space) ,可以指定仅仅处理哪些行 sed 符合模式条件的处理,不符合条件的不予处理,处理完成之后把缓冲区的内容送往屏幕接着处理下一行 ,这样不断重复 , 直到文件末尾,原来的内容是在磁盘当中放着,现在用sed命令处理的时候将内容掉入内存的一个地方用户处理,这个处理空间也叫模式空间。
##sed对字符的处理
名称 | 方法 |
---|---|
显示 | p |
删除 | d |
添加 | a |
替换 | c |
写入 | w |
插入 | i |
##p 模式操作——按照要求显示行
sed -n '/\:/p' fstab ##显示有:的行的内容
sed -n '/UUID$/P' fstab ##显示UUID结尾的行的内容
sed -n '/^UUID/P' fstab ##显示UUID开头的行的内容
sed -n '2,6p' fstab ##显示第二行到第六行的内容
sed -n '2,6!p' fstab ##显示除了2-6行都显示
## 移动挂载文件夹
[root@grep_sed mnt]# cp -p /etc/fstab .
##编辑该文件
[root@grep_sed mnt]# vim fstab
##查看文件内容
[root@grep_sed mnt]# cat fstab
#
# /etc/fstab
# Created by anaconda on Wed May 7 01:22:57 2014
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 / xfs defaults 1 1
GVBHJNKMLUUID
##显示有:的行的内容
[root@grep_sed mnt]# sed -n '/:/p' fstab
# Created by anaconda on Wed May 7 01:22:57 2014
##显示UUID结尾的行的内容
[root@grep_sed mnt]# sed -n '/UUID$/p' fstab
GVBHJNKMLUUID
##显示UUID开头的行的内容
[root@grep_sed mnt]# sed -n '/^UUID/p' fstab
UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 / xfs defaults 1 1
##显示第二行到第六行的内容
[root@grep_sed mnt]# sed -n '2,6p' fstab
#
# /etc/fstab
# Created by anaconda on Wed May 7 01:22:57 2014
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
##显示除了2-6行都显示
[root@grep_sed mnt]# sed -n '2,6!p' fstab
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 / xfs defaults 1 1
GVBHJNKMLUUID
##d 模式操作——按照要求删除行
sed '/^UUID/d' /etc/fstab ##删除UUID开头的行的内容
sed '/^#/d' /etc/fstab ##删除#开头的行的内容
sed '/^$/d' /etc/fstab ##删除空行
sed '1,4d' /etc/fstab ##删除1-4行的内容
sed '/^UUID/!d' /etc/fstab ##删除除UUID开头外的行的内容
##删除UUID开头的行的内容
root@grep_sed mnt]# sed '/^UUID/d' fstab
#
# /etc/fstab
# Created by anaconda on Wed May 7 01:22:57 2014
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
GVBHJNKMLUUID
##删除#开头的行的内容
[root@grep_sed mnt]# sed '/^#/d' fstab
UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 / xfs defaults 1 1
GVBHJNKMLUUID
##删除空行
[root@grep_sed mnt]# sed '/^$/d' fstab
#
# /etc/fstab
# Created by anaconda on Wed May 7 01:22:57 2014
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 / xfs defaults 1 1
GVBHJNKMLUUID
##删除1-4行的内容
[root@grep_sed mnt]# sed '/1,4/d' fstab
#
# /etc/fstab
# Created by anaconda on Wed May 7 01:22:57 2014
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 / xfs defaults 1 1
GVBHJNKMLUUID
##删除除UUID开头外的行的内容
[root@grep_sed mnt]# sed '/^UUID/!d' fstab
UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 / xfs defaults 1 1
##.a模式操作——按照要求添加
sed '/^UUID/ahello linux' fstab ##在UUID开头的行的后添加‘hello linux’
sed '/^UUID/ahello\nlinux' fstab ##在UUID开头的行的后面添加‘hello\nlinux’
##在UUID开头的行的后添加‘hello linux’
[root@grep_sed mnt]# sed '/^UUID/a hello linux' fstab
#
# /etc/fstab
# Created by anaconda on Wed May 7 01:22:57 2014
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 / xfs defaults 1 1
hello linux
GVBHJNKMLUUID
##在UUID开头的行的后面添加‘hello换行加linux’
[root@grep_sed mnt]# sed '/^UUID/a hello\n linux' fstab
#
# /etc/fstab
# Created by anaconda on Wed May 7 01:22:57 2014
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 / xfs defaults 1 1
hello
linux
GVBHJNKMLUUID
##c 模式操作——按照要求改变行
sed '/^#/chello\nlinux' fstab ##将#开头的行的内容用‘hello\nlinux’替换
##将#开头的行的内容用‘hello\nlinux’替换
[root@grep_sed mnt]# sed '/^#/ c hello \n linux' fstab
hello
linux
hello
linux
hello
linux
hello
linux
hello
linux
hello
linux
hello
linux
UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 / xfs defaults 1 1
GVBHJNKMLUUID
##w 模式操作——按照要求写入行
sed '/^#/w /mnt/testfile' fstab ##将fstab中以#为开头的行整合到/mnt/testfile中
sed -n '/^#/w /mnt/testfile' fstab ##不显示
sed '6r/mnt/linux' fstab ##将/mnt/linux中的所有内容整合到fstab的第六行中
####将fstab中以#为开头的行整合到testfile中
[root@grep_sed mnt]# sed '/^#/w textfile' fstab
#
# /etc/fstab
# Created by anaconda on Wed May 7 01:22:57 2014
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 / xfs defaults 1 1
GVBHJNKMLUUID
##查看有什么文件
[root@grep_sed mnt]# ls
file file1.rej file.path hosts passwd
file1 file.orig fstab num textfile
##查看 textfile 的内容
[root@grep_sed mnt]# cat textfile
#
# /etc/fstab
# Created by anaconda on Wed May 7 01:22:57 2014
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
##将/mnt/linux中的所有内容整合到fstab的第六行中
[root@grep_sed mnt]# sed '6rpasswd' fstab
#
# /etc/fstab
# Created by anaconda on Wed May 7 01:22:57 2014
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
gnome-initial-setup:x:993:991::/run/gnome-initial-setup/:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 / xfs defaults 1 1
GVBHJNKMLUUID
##i 模式操作——插入
sed '/^UUID/ihello\nlinux' fstab ##在UUID开头的行的前面添加‘hello\nlinux’
[root@grep_sed mnt]# sed '/^UUID/ihello\nlinux' fstab
#
# /etc/fstab
# Created by anaconda on Wed May 7 01:22:57 2014
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
hello
linux
UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 / xfs defaults 1 1
GVBHJNKMLUUID
##sed的其他用法
(1)显示UUID开头的行是第几行——sed -n ‘/^UUID/=’ fstab
[root@grep_sed mnt]# sed -n ‘/^UUID/=’ fstab
9
(2)显示UUID开头的行并标号——sed -n -e ‘/^UUID/p’ -e ‘/^ UUID/=’ fstab
[root@grep_sed mnt]# sed -n -e ‘/^UUID/p’ -e ‘/^UUID/=’ fstab
UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 / xfs defaults 1 1
9
(3)将所有的:转化为@@—— sed ‘s/?@@/g’ passwd
[root@grep_sed mnt]# sed ‘s/?@@/g’ 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
adm@@x@@3@@4@@adm@@/var/adm@@/sbin/nologin
lp@@x@@4@@7@@lp@@/var/spool/lpd@@/sbin/nologin
sync@@x@@5@@0@@sync@@/sbin@@/bin/sync
shutdown@@x@@6@@0@@shutdown@@/sbin@@/sbin/shutdown
halt@@x@@7@@0@@halt@@/sbin@@/sbin/halt
mail@@x@@8@@12@@mail@@/var/spool/mail@@/sbin/nologin
gdm@@x@@42@@42@@@@/var/lib/gdm@@/sbin/nologin
gnome-initial-setup@@x@@993@@991@@@@/run/gnome-initial-setup/@@/sbin/nologin
tcpdump@@x@@72@@72@@@@/@@/sbin/nologin
(4)将1-3行的:转化为@@—— sed ‘s/?@@/g’ passwd
[root@grep_sed mnt]# sed ‘1,3s/?@@/g’ 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
adm❌3:4:adm:/var/adm:/sbin/nologin
lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
sync❌5:0:sync:/sbin:/bin/sync
shutdown❌6:0:shutdown:/sbin:/sbin/shutdown
halt❌7:0:halt:/sbin:/sbin/halt
mail❌8:12:mail:/var/spool/mail:/sbin/nologin
gdm❌42:42::/var/lib/gdm:/sbin/nologin
gnome-initial-setup❌993:991::/run/gnome-initial-setup/:/sbin/nologin
tcpdump❌72:72:?:/sbin/nologin
(5)以adm开头的行到shut开头的行中:转化为@@——sed ‘/adm/,/shut/s/?@@/g’ passwd
[root@grep_sed mnt]# sed ‘/adm/,/shut/s/?@@/g’ passwd
root❌0:0:root:/root:/bin/bash
bin❌1:1:bin:/bin:/sbin/nologin
daemon❌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
sync@@x@@5@@0@@sync@@/sbin@@/bin/sync
shutdown@@x@@6@@0@@shutdown@@/sbin@@/sbin/shutdown
halt❌7:0:halt:/sbin:/sbin/halt
mail❌8:12:mail:/var/spool/mail:/sbin/nologin
gdm❌42:42::/var/lib/gdm:/sbin/nologin
gnome-initial-setup❌993:991::/run/gnome-initial-setup/:/sbin/nologin
tcpdump❌72:72:?:/sbin/nologin
执行两个时用;例如:sed ‘/adm/,/shut/s/?@@/g;1,3s/: /@@/g’ passwd
(6)在每行行后插入一个空白行——sed G passwd
[root@grep_sed mnt]# sed G 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
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
gnome-initial-setup:x:993:991::/run/gnome-initial-setup/:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
(7)在除最后一行外的每行行后插入一个空白行——sed ‘$!G’ passwd
[root@grep_sed mnt]# sed '$!G' 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
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
gnome-initial-setup:x:993:991::/run/gnome-initial-setup/:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
(8)在空白行前添加行号—— sed = passwd
[root@grep_sed mnt]# sed = passwd
1
root❌0:0:root:/root:/bin/bash
2
bin❌1:1:bin:/bin:/sbin/nologin
3
daemon❌2:2:daemon:/sbin:/sbin/nologin
4
adm❌3:4:adm:/var/adm:/sbin/nologin
5
lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
6
sync❌5:0:sync:/sbin:/bin/sync
7
shutdown❌6:0:shutdown:/sbin:/sbin/shutdown
8
halt❌7:0:halt:/sbin:/sbin/halt
9
mail❌8:12:mail:/var/spool/mail:/sbin/nologin
10
gdm❌42:42::/var/lib/gdm:/sbin/nologin
11
gnome-initial-setup❌993:991::/run/gnome-initial-setup/:/sbin/nologin
12
tcpdump❌72:72:?:/sbin/nologin
(9)每行行前添加行号——sed = passwd | sed ‘N;s/\n//g’
[root@grep_sed mnt]# sed = passwd | sed ‘N;s/\n//g’
1root❌0:0:root:/root:/bin/bash
2bin❌1:1:bin:/bin:/sbin/nologin
3daemon❌2:2:daemon:/sbin:/sbin/nologin
4adm❌3:4:adm:/var/adm:/sbin/nologin
5lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
6sync❌5:0:sync:/sbin:/bin/sync
7shutdown❌6:0:shutdown:/sbin:/sbin/shutdown
8halt❌7:0:halt:/sbin:/sbin/halt
9mail❌8:12:mail:/var/spool/mail:/sbin/nologin
10gdm❌42:42::/var/lib/gdm:/sbin/nologin
11gnome-initial-setup❌993:991::/run/gnome-initial-setup/:/sbin/nologin
12tcpdump❌72:72:?:/sbin/nologin
(10)显示最后一行——sed -n ‘KaTeX parse error: Expected 'EOF', got '#' at position 30: …t@grep_sed mnt]#̲ sed -n 'p’ passwd
tcpdump❌72:72:?:/sbin/nologin
报告生成器——awk
一个 awk脚本通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块3部分组成,这三个部分是可选的。任意一个部分都可以不出现在脚本中,脚本通常是被单引号或双引号中;
(1) BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中。
(2)pattern语句块中的通用命令是最重要的部分,它也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块。
(3)END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。
##awk -F——指定分隔符
##以:为分隔符,打印passwd文件的的第一列字符
[root@shell_awk mnt]# awk -F : ‘{print $1}’ passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody
dbus
polkitd
avahi
##以:为分隔符,打印第一列和第二列,不出现:分隔符
[root@shell_awk mnt]# awk -F : ‘{print $1$2}’ passwd
rootx
binx
daemonx
admx
lpx
syncx
shutdownx
haltx
mailx
operatorx
gamesx
ftpx
nobodyx
##以:为分隔符,在打印前先打印WESTOS,然后在打印第一列
[root@shell_awk mnt]# awk -F : ‘BEGIN{print “WESTOS”}{print $1}’ passwd
WESTOS
root
adm
sync
shutdown
halt
mail
operator
games
ftp
gdm
gnome-initial-setup
tcpdump
root ROOT njvlksdvmROOT SKDVMS root
ROOT SDKLJNVCS root
ROOT root sdvkn ROOT root
##以:为分隔符,先决定n=1,然后答应第一列 n(其中n=1)——相当于打印第一列后加1
[root@shell_awk mnt]# awk -F : ‘BEGIN{n=1}{print $1,n}’ passwd
root 1
adm 1
sync 1
shutdown 1
halt 1
mail 1
operator 1
games 1
ftp 1
gdm 1
gnome-initial-setup 1
tcpdump 1
root ROOT njvlksdvmROOT SKDVMS root 1
ROOT SDKLJNVCS root 1
ROOT root sdvkn ROOT root 1
##打印第一列加上序号
[root@shell_awk mnt]# awk -F : ‘BEGIN{n=1}{print $1,n++}’ passwd
root 1
adm 2
sync 3
shutdown 4
halt 5
mail 6
operator 7
games 8
ftp 9
gdm 10
gnome-initial-setup 11
tcpdump 12
root ROOT njvlksdvmROOT SKDVMS root 13
ROOT SDKLJNVCS root 14
ROOT root sdvkn ROOT root 15
##加上序号打印第一列
[root@shell_awk mnt]# awk -F : ‘BEGIN{n=1}{print n++,$1}’ passwd
1 root
2 adm
3 sync
4 shutdown
5 halt
6 mail
7 operator
8 games
9 ftp
10 gdm
11 gnome-initial-setup
12 tcpdump
13 root ROOT njvlksdvmROOT SKDVMS root
14 ROOT SDKLJNVCS root
15 ROOT root sdvkn ROOT root
##加上序号打印第一列,最后显示行数(NR);(NF列)
[root@shell_awk mnt]# awk -F : ‘BEGIN{n=1}{print n++,$1}END{print NR}’ passwd
1 root
2 adm
3 sync
4 shutdown
5 halt
6 mail
7 operator
8 games
9 ftp
10 gdm
11 gnome-initial-setup
12 tcpdump
13 root ROOT njvlksdvmROOT SKDVMS root
14 ROOT SDKLJNVCS root
15 ROOT root sdvkn ROOT root
15
##输出包含bash行的第一个字符
[root@shell_awk mnt]# awk -F : ‘/bash/{print $1}’ passwd
root
##打印第四行的第三个字符
[root@shell_awk mnt]# awk -F : ‘NR==4{print $1}’ passwd
shutdown
##打印第四行到第八行的内容
[root@shell_awk mnt]# awk -F : ‘NR>=4&&NR<=8{print}’ passwd
shutdown❌6:0:shutdown:/sbin:/sbin/shutdown
halt❌7:0:halt:/sbin:/sbin/halt
mail❌8:12:mail:/var/spool/mail:/sbin/nologin
operator❌11:0:operator:/root:/sbin/nologin
games❌12?games:/usr/games:/sbin/nologin
##打印第四行和第八行
[root@shell_awk mnt]# awk -F : ‘NR4||NR8{print}’ passwd
shutdown❌6:0:shutdown:/sbin:/sbin/shutdown
games❌12?games:/usr/games:/sbin/nologin
##输出a+8的值
[root@shell_awk mnt]# awk ‘BEGIN{a=13;print a+8}’
21
##输出不是以a-d开头的行
[root@shell_awk mnt]# awk ‘/[a-d]/{print}’ passwd
root❌0:0:root:/root:/bin/bash
sync❌5:0:sync:/sbin:/bin/sync
shutdown❌6:0:shutdown:/sbin:/sbin/shutdown
halt❌7:0:halt:/sbin:/sbin/halt
mail❌8:12:mail:/var/spool/mail:/sbin/nologin
operator❌11:0:operator:/root:/sbin/nologin
games❌12?games:/usr/games:/sbin/nologin
ftp❌14:50:FTP User:/var/ftp:/sbin/nologin
gdm❌42:42::/var/lib/gdm:/sbin/nologin
gnome-initial-setup❌993:991::/run/gnome-initial-setup/:/sbin/nologin
tcpdump❌72:72:?:/sbin/nologin
root ROOT njvlksdvmROOT SKDVMS root
ROOT SDKLJNVCS root
ROOT root sdvkn ROOT root
##输出以r开头或者以nologin结尾的行
[root@shell_awk mnt]# awk ‘/^r||nologin$/{print}’ passwd
root❌0:0:root:/root:/bin/bash
adm❌3:4:adm:/var/adm:/sbin/nologin
mail❌8:12:mail:/var/spool/mail:/sbin/nologin
operator❌11:0:operator:/root:/sbin/nologin
games❌12?games:/usr/games:/sbin/nologin
ftp❌14:50:FTP User:/var/ftp:/sbin/nologin
gdm❌42:42::/var/lib/gdm:/sbin/nologin
gnome-initial-setup❌993:991::/run/gnome-initial-setup/:/sbin/nologin
tcpdump❌72:72:?:/sbin/nologin
root ROOT njvlksdvmROOT SKDVMS root
##以g开头并且以nologin结尾的行
[root@shell_awk mnt]# awk ‘/^g/&&/nologin$/{print}’ passwd
games❌12?games:/usr/games:/sbin/nologin
gdm❌42:42::/var/lib/gdm:/sbin/nologin
gnome-initial-setup❌993:991::/run/gnome-initial-setup/:/sbin/nologin
##打印第一列以root结尾的行
[root@shell_awk mnt]# awk -F : '$1~/root$/{print}' passwd
root ROOT njvlksdvmROOT SKDVMS root
ROOT SDKLJNVCS root
ROOT root sdvkn ROOT root
##打印第六列含有bin的行
[root@shell_awk mnt]# awk -F : '$6~/\<bin$/{print}' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
##打印第六列不是以bin结尾的行
[root@shell_awk mnt]# awk -F : '$6!~/\<bin$/{print}' passwd
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
gnome-initial-setup:x:993:991::/run/gnome-initial-setup/:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
root ROOT njvlksdvmROOT SKDVMS root
ROOT SDKLJNVCS root
ROOT root sdvkn ROOT root