9.4/9.5 sed
sed的优势在于替换指定的字符
sed如何实现grep的功能
sed '/关键词/'p 文件(p不可少) 匹配关键字,类似于 grep
sed '数字'p 文件 打印具体一行
-n 静默输出(--quite --silent)
-r 脱义
-e 一个表达式做多个操作
-i 删除文件中的内容
p print 打印
d delete 删除
·sed 匹配
过滤出含有 root 的行
[root@arslinux-01 sed]# sed -n '/root/'p test.txt root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin
过滤出 r*t 的行
[root@arslinux-01 sed]# sed -n '/r*t/'p test.txt root:x:0:0:root:/root:/bin/bash shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt operator:x:11:0:operator:/root:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin polkitd:x:999:998:User for polkitd:/:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin roooooooooooooooot
-r 脱义,+ 作为符号,前方的o出现 1 次或多次
[root@arslinux-01 sed]# sed -nr '/o+t/'p test.txt root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin roooooooooooooooot
o出现2次
[root@arslinux-01 sed]# sed -nr '/o{2}/'p test.txt root:x:0:0:root:/root:/bin/bash lp:x:4:7:lp:/var/spool/lpd:/sbin/NOlogin mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin roooooooooooooooot
| root 或者 bus
[root@arslinux-01 sed]# sed -nr '/root|bus/'p test.txt root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin
·sed打印具体行数
打印第 2 行
[root@arslinux-01 sed]# sed -n '2'p test.txt bin:x:1:1:bin:/bin:/sbin/nologin
打印 2 到 5 行
[root@arslinux-01 sed]# sed -n '2,5'p test.txt 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
打印 25 到末行
[root@arslinux-01 sed]# sed -n '25,$'p test.txt user4:x:1006:1005::/home/arslinux:/sbin/nologin user5:x:1007:1007::/home/user5:/bin/bash user6:x:1008:1010::/home/user6:/bin/bash roooooooooooooooot
打印所有行
[root@arslinux-01 sed]# sed -n '1,$'p test.txt
sed -e 一个表达式做多个动作
打印出第一行的同时,匹配 bus 的行
[root@arslinux-01 sed]# sed -e '1'p -e '/bus/'p -n test.txt root:x:0:0:root:/root:/bin/bash dbus:x:81:81:System message bus:/:/sbin/nologin
如果 -e 操作的前方和后方操作结果一样,那么会打印两次
[root@arslinux-01 sed]# sed -e '1'p -e '/root/'p -n test.txt root:x:0:0:root:/root:/bin/bash root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin
匹配三个关键字
[root@arslinux-01 sed]# sed -e '1'p -e '/root/'p -e '/oo*/'p -n test.txt root:x:0:0:root:/root:/bin/bash root:x:0:0:root:/root:/bin/bash 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 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown ada:ro.odaf mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/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 nobody:x:99:99:Nobody:/:/sbin/nologin systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin polkitd:x:999:998:User for polkitd:/:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin chrony:x:998:996::/var/lib/chrony:/sbin/nologin arslinux:x:1000:1000::/home/arslinux:/bin/bash user1:x:1001:1001::/home/user1:/bin/bash user2:x:1002:1006::/home/user2:/bin/bash user3:x:1004:1005::/home/user3:/bin/bash user4:x:1006:1005::/home/arslinux:/sbin/nologin user5:x:1007:1007::/home/user5:/bin/bash user6:x:1008:1010::/home/user6:/bin/bash roooooooooooooooot
不区分大小写,在 p 前加大写 I
[root@arslinux-01 sed]# sed -n '/bus/'Ip test.txt BUSnobody:x:99:99:Nobody:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin
·删除指定的行(只是在结果中删除)
删除 1 到 25 行,把其余显示出来
[root@arslinux-01 sed]# sed '1,25'd test.txt user5:x:1007:1007::/home/user5:/bin/bash user6:x:1008:1010::/home/user6:/bin/bash roooooooooooooooot
如果想删除前5个月的日志,只保留最近一个月的日志,那么可以grep -n 利用时间戳,过滤出要删除的行的行号,然后通过 sed ‘行数’d 来删除
·在文件中删除指定的行
sed -i '数字'd 文件 删除指定的行
[root@arslinux-01 sed]# cp test.txt test.txt.bak [root@arslinux-01 sed]# sed -i '1,25'd test.txt [root@arslinux-01 sed]# wc -l test.txt 3 test.txt
sed -i '/关键字/'d 文件 删除含有相关字符的行
[root@arslinux-01 sed]# sed -i '/user2/'d test.txt [root@arslinux-01 sed]# cat test.txt |grep user2 [root@arslinux-01 sed]# cat test.txt |grep user3 user3:x:1004:1005::/home/user3:/bin/bash
·sed 替换功能
sed '行数范围s/被替换字符/要替换成的字符/g' 文件名(不指定范围就是全部)
s/1/2/ 替换的内容
g 复制/追加hold space的内容到pattern space
1-10行的root换为rose
[root@arslinux-01 sed]# sed '1,10s/root/rose/g' test.txt | head rose:x:0:0:rose:/rose:/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 ada:ro.odaf halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
这里加 head 只显示前十行
[root@arslinux-01 sed]# sed -r '1,10s/ro+/r/g' test.txt |head rt:x:0:0:rt:/rt:/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 ada:r.odaf halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
将 : 分割的部分,第一段和最后一段对调
[root@arslinux-01 sed]# head test.txt | sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/' /bin/bash:x:0:0:root:/root:root /sbin/nologin:x:1:1:bin:/bin:bin /sbin/nologin:x:2:2:daemon:/sbin:daemon /sbin/nologin:x:3:4:adm:/var/adm:adm /sbin/NOlogin:x:4:7:lp:/var/spool/lpd:lp /bin/sync:x:5:0:sync:/sbin:sync /sbin/shutdown:x:6:0:shutdown:/sbin:shutdown ada:ro.odaf /sbin/halt:x:7:0:halt:/sbin:halt /sbin/nologin:x:8:12:mail:/var/spool/mail:mail
根据文件内容,用 : 来分割,第一部分为非 : 字符出现1次或多次,用括号扩起做第一部分,第二部分和第一部分之间有 : 分割,第二部分贪婪匹配到最后一个 : ,第二三部分之间依然是 : 分割,第三部分是非 : 字符出现一次或多次,然后在后方将 一,三部分对调为 \3:\2:\1,后方用 “\数字” 表示每个部分
分隔符用@ #都可以,这样用/ /的时候就不用加 \ 脱义
把 /root 替换成 123
[root@arslinux-01 sed]# head test.txt | sed 's//root/123/g' sed:-e 表达式 #1,字符 12:“s”的未知选项 [root@arslinux-01 sed]# head test.txt | sed 's/\/root/123/g' root:x:0:0:root:123:/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 ada:ro.odaf halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
用 # 或 @ 做分隔符,无需 \ 脱义
[root@arslinux-01 sed]# head test.txt | sed 's#/root#123#g' root:x:0:0:root:123:/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 ada:ro.odaf halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
把字母删除=把字母替换为空
[root@arslinux-01 sed]# head test.txt |sed 's/[a-zA-Z]//g' ::0:0::/:// ::1:1::/:// ::2:2::/:// ::3:4:://:// ::4:7::///:// ::5:0::/:// ::6:0::/:// :. ::7:0::/:// ::8:12::///://
把数字删除
[root@arslinux-01 sed]# head test.txt |sed 's/[0-9]//g' root:x:::root:/root:/bin/bash bin:x:::bin:/bin:/sbin/nologin daemon:x:::daemon:/sbin:/sbin/nologin adm:x:::adm:/var/adm:/sbin/nologin lp:x:::lp:/var/spool/lpd:/sbin/NOlogin sync:x:::sync:/sbin:/bin/sync shutdown:x:::shutdown:/sbin:/sbin/shutdown ada:ro.odaf halt:x:::halt:/sbin:/sbin/halt mail:x:::mail:/var/spool/mail:/sbin/nologin
所有行前面加上字符串
[root@arslinux-01 sed]# head test.txt |sed -r 's/(.*)/aaa:&/' aaa:root:x:0:0:root:/root:/bin/bash aaa:bin:x:1:1:bin:/bin:/sbin/nologin aaa:daemon:x:2:2:daemon:/sbin:/sbin/nologin aaa:adm:x:3:4:adm:/var/adm:/sbin/nologin aaa:lp:x:4:7:lp:/var/spool/lpd:/sbin/NOlogin aaa:sync:x:5:0:sync:/sbin:/bin/sync aaa:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown aaa:ada:ro.odaf aaa:halt:x:7:0:halt:/sbin:/sbin/halt aaa:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
(.*)匹配原本一行,&表示的就是前面的()里的内容,将(.*)替换成aaa:(.*),一定要 -r 脱义
9.6/9.7 awk
awk -F '分隔符' ‘{print $数字}’ 打印出第几段(不删文件内容,$0指全部内容)
awk 无需脱义
用 : 作为分隔符,打印出第一段
[root@arslinux-01 awk]# awk -F ':' '{print $1}' passwd root bin daemon adm lp sync shutdown halt mail operator games ftp nobody systemd-network dbus polkitd sshd postfix chrony arslinux user1 user2 user3 user4 user5 user6
·打印出所有段
[root@arslinux-01 awk]# awk '{print $0}' 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 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 nobody:x:99:99:Nobody:/:/sbin/nologin systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin polkitd:x:999:998:User for polkitd:/:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin chrony:x:998:996::/var/lib/chrony:/sbin/nologin arslinux:x:1000:1000::/home/arslinux:/bin/bash user1:x:1001:1001::/home/user1:/bin/bash user2:x:1002:1006::/home/user2:/bin/bash user3:x:1004:1005::/home/user3:/bin/bash user4:x:1006:1005::/home/arslinux:/sbin/nologin user5:x:1007:1007::/home/user5:/bin/bash user6:x:1008:1010::/home/user6:/bin/bash
打印全部内容,无需指定分隔符
★ awk 如果不指定分隔符,那么默认以空格或空白字符为分隔符去打印
创建测试文件
[root@arslinux-01 awk]# cat 1.txt 1 2 aa bb dd ee [root@arslinux-01 awk]# awk '{print $1}' 1.txt 1 aa dd [root@arslinux-01 awk]# awk '{print $2}' 1.txt 2 bb ee
·打印多段内容
[root@arslinux-01 awk]# awk -F ':' '{print $1,$3,$4}' passwd root 0 0 bin 1 1 daemon 2 2 adm 3 4 lp 4 7 sync 5 0 shutdown 6 0 halt 7 0 mail 8 12 operator 11 0 games 12 100 ftp 14 50 nobody 99 99 systemd-network 192 192 dbus 81 81 polkitd 999 998 sshd 74 74 postfix 89 89 chrony 998 996 arslinux 1000 1000 user1 1001 1001 user2 1002 1006 user3 1004 1005 user4 1006 1005 user5 1007 1007 user6 1008 1010
·指定分隔符
[root@arslinux-01 awk]# awk -F ':' '{print $1"#"$3"#"$4}' passwd root#0#0 bin#1#1 daemon#2#2 adm#3#4 lp#4#7 sync#5#0 shutdown#6#0 halt#7#0 mail#8#12 operator#11#0 games#12#100 ftp#14#50 nobody#99#99 systemd-network#192#192 dbus#81#81 polkitd#999#998 sshd#74#74 postfix#89#89 chrony#998#996 arslinux#1000#1000 user1#1001#1001 user2#1002#1006 user3#1004#1005 user4#1006#1005 user5#1007#1007 user6#1008#1010
1,、awk 匹配
匹配出含有 oo 的行
[root@arslinux-01 awk]# awk '/oo/' passwd root:x:0:0:root:/root:/bin/bash lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin
匹配出第一段含有 oo 的行
[root@arslinux-01 awk]# awk -F ':' '$1 ~ /oo/' passwd root:x:0:0:root:/root:/bin/bash
~ 表示匹配,后接匹配的内容
匹配出第一段有 o 的行
[root@arslinux-01 awk]# awk -F ':' '$1 ~ /o+/' passwd root:x:0:0:root:/root:/bin/bash daemon:x:2:2:daemon:/sbin:/sbin/nologin shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown operator:x:11:0:operator:/root:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin polkitd:x:999:998:User for polkitd:/:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin chrony:x:998:996::/var/lib/chrony:/sbin/nologin
匹配出第一段有至少两个 o 的行
[root@arslinux-01 awk]# awk -F ':' '$1 ~ /oo+/' passwd root:x:0:0:root:/root:/bin/bash
passwd中,以:分段,匹配root的行,打印该行1、3段,匹配user的行打印该行3、4段
[root@arslinux-01 awk]# awk -F ':' '/root/{print $1,$3} /user/{print $3,$4}' passwd root 0 operator 11 1001 1001 1002 1006 1004 1005 1006 1005 1007 1007 1008 1010
·匹配包含 root 和 user 的行
[root@arslinux-01 awk]# awk -F ':' '/root|user/' passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin user1:x:1001:1001::/home/user1:/bin/bash user2:x:1002:1006::/home/user2:/bin/bash user3:x:1004:1005::/home/user3:/bin/bash user4:x:1006:1005::/home/arslinux:/sbin/nologin user5:x:1007:1007::/home/user5:/bin/bash user6:x:1008:1010::/home/user6:/bin/bash [root@arslinux-01 awk]# awk -F ':' '/root|user/ {print $0}' passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin user1:x:1001:1001::/home/user1:/bin/bash user2:x:1002:1006::/home/user2:/bin/bash user3:x:1004:1005::/home/user3:/bin/bash user4:x:1006:1005::/home/arslinux:/sbin/nologin user5:x:1007:1007::/home/user5:/bin/bash user6:x:1008:1010::/home/user6:/bin/bash
2、awk 数学运算表达式
·匹配第三段 = 0 的行
[root@arslinux-01 awk]# awk -F : '$3==1000' passwd arslinux:x:1000:1000::/home/arslinux:/bin/bash
如果只写一个 = ,那么会把所有行第三段赋值成 1000 并打印
·匹配第三段 = 0 的行,并打印出第1和7段
[root@arslinux-01 awk]# awk -F : '$3==1000{print $1,$7}' passwd arslinux /bin/bash
·匹配第三段 > = 1000 的行
[root@arslinux-01 awk]# awk -F : '$3>=1000' passwd arslinux:x:1000:1000::/home/arslinux:/bin/bash user1:x:1001:1001::/home/user1:/bin/bash user2:x:1002:1006::/home/user2:/bin/bash user3:x:1004:1005::/home/user3:/bin/bash user4:x:1006:1005::/home/arslinux:/sbin/nologin user5:x:1007:1007::/home/user5:/bin/bash user6:x:1008:1010::/home/user6:/bin/bash
★如果数字加上 " " ,会ASCII排序方式也就是字符串的顺序来算的,而不是按数字来算
[root@arslinux-01 awk]# awk -F : '$3>="1000"' passwd 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 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 nobody:x:99:99:Nobody:/:/sbin/nologin systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin polkitd:x:999:998:User for polkitd:/:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin chrony:x:998:996::/var/lib/chrony:/sbin/nologin arslinux:x:1000:1000::/home/arslinux:/bin/bash user1:x:1001:1001::/home/user1:/bin/bash user2:x:1002:1006::/home/user2:/bin/bash
·匹配第七段不 = /sbin/nologin 的行(匹配的内容如果是字符串需要加双引号)
[root@arslinux-01 awk]# awk -F : '$7!="/sbin/nologin"' passwd root:x:0:0:root:/root:/bin/bash sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt arslinux:x:1000:1000::/home/arslinux:/bin/bash user1:x:1001:1001::/home/user1:/bin/bash user2:x:1002:1006::/home/user2:/bin/bash user3:x:1004:1005::/home/user3:/bin/bash user5:x:1007:1007::/home/user5:/bin/bash
3、两个字段比较大小
匹配第三段比第四段小的行
[root@arslinux-01 awk]# awk -F : '$3<$4' passwd adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin mail:x:8:12:mail:/var/spool/mail:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin user2:x:1002:1006::/home/user2:/bin/bash user3:x:1004:1005::/home/user3:/bin/bash user6:x:1008:1010::/home/user6:/bin/bash
匹配第三段和第四段相等的行
[root@arslinux-01 awk]# awk -F : '$3==$4' 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 nobody:x:99:99:Nobody:/:/sbin/nologin systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin arslinux:x:1000:1000::/home/arslinux:/bin/bash user1:x:1001:1001::/home/user1:/bin/bash user5:x:1007:1007::/home/user5:/bin/bash
匹配第三段大于字符5,且小于字符8的行
[root@arslinux-01 awk]# awk -F : '$3>"5" && $3<"8"' passwd shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
匹配第三段大于数字1000,或者第七段等于 /sbin/nologin 的行
[root@arslinux-01 awk]# awk -F : '$3>1000 || $7=="/sbin/nologin"' passwd 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 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 nobody:x:99:99:Nobody:/:/sbin/nologin systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin polkitd:x:999:998:User for polkitd:/:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin chrony:x:998:996::/var/lib/chrony:/sbin/nologin user1:x:1001:1001::/home/user1:/bin/bash user2:x:1002:1006::/home/user2:/bin/bash user3:x:1004:1005::/home/user3:/bin/bash user4:x:1006:1005::/home/arslinux:/sbin/nologin user5:x:1007:1007::/home/user5:/bin/bash user6:x:1008:1010::/home/user6:/bin/bash
匹配第七段包含 bash 的行
[root@arslinux-01 awk]# awk -F : '$7 ~ /bash/' passwd root:x:0:0:root:/root:/bin/bash arslinux:x:1000:1000::/home/arslinux:/bin/bash user1:x:1001:1001::/home/user1:/bin/bash user2:x:1002:1006::/home/user2:/bin/bash user3:x:1004:1005::/home/user3:/bin/bash user5:x:1007:1007::/home/user5:/bin/bash user6:x:1008:1010::/home/user6:/bin/bash
4、内置变量 OFS
指定打印时的分隔符:{OFS=' '} 要在print前使用
指定目前的分隔符;OFS指定要改为什么分隔符;条件(不写条件就是全部);打印的段
匹配第七段包含 bash 的行,并打印出第1,3,7段,且用#分割各段
[root@arslinux-01 awk]# awk -F : '{OFS="#"} $7 ~ /bash/{print $1,$3,$7}' passwd root#0#/bin/bash arslinux#1000#/bin/bash user1#1001#/bin/bash user2#1002#/bin/bash user3#1004#/bin/bash user5#1007#/bin/bash user6#1008#/bin/bash
if 条件,后面为一个部分
[root@arslinux-01 awk]# awk -F : '{OFS="#"}{if ($3>1000){print $1,$2,$3,$4}}' passwd user1#x#1001#1001 user2#x#1002#1006 user3#x#1004#1005 user4#x#1006#1005 user5#x#1007#1007 user6#x#1008#1010 [root@arslinux-01 awk]# awk -F : '{OFS="#"}$3>1000{print $1,$2,$3,$4}' passwd user1#x#1001#1001 user2#x#1002#1006 user3#x#1004#1005 user4#x#1006#1005 user5#x#1007#1007 user6#x#1008#1010
上面两种是同一个意思,前一种更规整
内置变量NR 表示行号
[root@arslinux-01 awk]# awk -F : '{print NR":"$0}' 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 11:games:x:12:100:games:/usr/games:/sbin/nologin 12:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 13:nobody:x:99:99:Nobody:/:/sbin/nologin 14:systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin 15:dbus:x:81:81:System message bus:/:/sbin/nologin 16:polkitd:x:999:998:User for polkitd:/:/sbin/nologin 17:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin 18:postfix:x:89:89::/var/spool/postfix:/sbin/nologin 19:chrony:x:998:996::/var/lib/chrony:/sbin/nologin 20:arslinux:x:1000:1000::/home/arslinux:/bin/bash 21:user1:x:1001:1001::/home/user1:/bin/bash 22:user2:x:1002:1006::/home/user2:/bin/bash 23:user3:x:1004:1005::/home/user3:/bin/bash 24:user4:x:1006:1005::/home/arslinux:/sbin/nologin 25:user5:x:1007:1007::/home/user5:/bin/bash 26:user6:x:1008:1010::/home/user6:/bin/bash
内置变量NF 表示段号
[root@arslinux-01 awk]# awk -F : '{print NF":"$0}' passwd 6:rootx:0:0:root:/root:/bin/bash 7:bin:x:1:1:bin:/bin:/sbin/nologin 7:daemon:x:2:2:daemon:/sbin:/sbin/nologin 7:adm:x:3:4:adm:/var/adm:/sbin/nologin 7:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 7:sync:x:5:0:sync:/sbin:/bin/sync 7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 7:halt:x:7:0:halt:/sbin:/sbin/halt 7:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 7:operator:x:11:0:operator:/root:/sbin/nologin 7:games:x:12:100:games:/usr/games:/sbin/nologin 7:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 7:nobody:x:99:99:Nobody:/:/sbin/nologin 7:systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin 7:dbus:x:81:81:System message bus:/:/sbin/nologin 7:polkitd:x:999:998:User for polkitd:/:/sbin/nologin 7:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin 7:postfix:x:89:89::/var/spool/postfix:/sbin/nologin 7:chrony:x:998:996::/var/lib/chrony:/sbin/nologin 7:arslinux:x:1000:1000::/home/arslinux:/bin/bash 7:user1:x:1001:1001::/home/user1:/bin/bash 7:user2:x:1002:1006::/home/user2:/bin/bash 7:user3:x:1004:1005::/home/user3:/bin/bash 7:user4:x:1006:1005::/home/arslinux:/sbin/nologin 7:user5:x:1007:1007::/home/user5:/bin/bash 7:user6:x:1008:1010::/home/user6:/bin/bash
第一段改为6行后,可以看到区别
匹配出前十行
[root@arslinux-01 awk]# awk -F : 'NR<=10' 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 operator:x:11:0:operator:/root:/sbin/nologin
匹配前十行里,第一段包含 root 或者 sync 的行
[root@arslinux-01 awk]# awk -F : 'NR<=10 && $1 ~ /root|sync/' passwd root:x:0:0:root:/root:/bin/bash sync:x:5:0:sync:/sbin:/bin/sync
匹配有6段的行里,第一段包含 root 或者 sync 的行
[root@arslinux-01 awk]# awk -F : 'NF==6 && $1 ~ /root|sync/' passwd rootx:0:0:root:/root:/bin/bash [root@arslinux-01 awk]# awk -F : 'NF==6' passwd rootx:0:0:root:/root:/bin/bash
匹配$行号:$段数
[root@arslinux-01 awk]# awk -F : '{print $NR":"$NF}' passwd rootx:/bin/bash x:/sbin/nologin 2:/sbin/nologin 4:/sbin/nologin lp:/sbin/nologin /sbin:/bin/sync /sbin/shutdown:/sbin/shutdown :/sbin/halt :/sbin/nologin :/sbin/nologin :/sbin/nologin :/sbin/nologin :/sbin/nologin :/sbin/nologin :/sbin/nologin :/sbin/nologin :/sbin/nologin :/sbin/nologin :/sbin/nologin :/bin/bash :/bin/bash :/bin/bash :/bin/bash :/sbin/nologin :/bin/bash :/bin/bash
第一行为第一行的$1:$7,第二行为第二行的$2:$7 。。。第八行没有$8,所以不存在
匹配第一段为 root 的行,后一段表示 将第一段赋值为 root
[root@arslinux-01 awk]# head -3 /etc/passwd | awk -F : '$1=="root"' root:x:0:0:root:/root:/bin/bash [root@arslinux-01 awk]# head -3 /etc/passwd | awk -F : '$1="root"' root x 0 0 root /root /bin/bash root x 1 1 bin /bin /sbin/nologin root x 2 2 daemon /sbin /sbin/nologin
增加分隔符
[root@arslinux-01 awk]# head -3 /etc/passwd | awk -F : '{OFS="#"}$1="root"' root#x#0#0#root#/root#/bin/bash root#x#1#1#bin#/bin#/sbin/nologin root#x#2#2#daemon#/sbin#/sbin/nologin
5、需求
1)tot 求和
[root@arslinux-01 awk]# awk -F : '{tot=tot+$3};END {print tot}' passwd 9633
每次循环都会将第三段的值相加
tot=tot+$3,第一次循环是 0 + 第一行的第三段,第二次循环是 第一行的第三段 + 第二行的第三段,第三次循环是 第二行的第三段 + 第三行的第三段,以此类推
2)if 判断
如果第一段是user1,那么打出所有行。就是打印第一段为user1的行
[root@arslinux-01 awk]# awk -F : '{if($1=="user1"){print $0}}' passwd user1:x:1001:1001::/home/user1:/bin/bash
以下内容为扩展部分,先挑着能看懂的练习练习。
打印某行到某行之间的内容http://ask.apelearn.com/question/559
sed转换大小写 http://ask.apelearn.com/question/7758
sed在某一行最后添加一个数字http://ask.apelearn.com/question/288
删除某行到最后一行 http://ask.apelearn.com/question/213
打印1到100行含某个字符串的行 http://ask.apelearn.com/question/1048
awk 中使用外部shell变量http://ask.apelearn.com/question/199
awk 合并一个文件 http://ask.apelearn.com/question/493
把一个文件多行连接成一行 http://ask.apelearn.com/question/266
awk中gsub函数的使用 http://ask.apelearn.com/question/200
awk 截取指定多个域为一行 http://ask.apelearn.com/question/224
过滤两个或多个关键词 http://ask.apelearn.com/question/198
用awk生成以下结构文件 http://ask.apelearn.com/question/5494
awk用print打印单引号 http://ask.apelearn.com/question/1738
合并两个文件 http://ask.apelearn.com/question/945
awk的BEGIN和END https://blog.51cto.com/151wqooo/1309851
awk的参考教程 http://www.cnblogs.com/emanlee/p/3327576.html