https://blog.51cto.com/11530642/2376266
9.4/9.5 sed
常用选项 |
含义 |
-n |
静默输出(–quite --silent) |
-r |
脱义 |
-e |
一个表达式做多个操作 |
-i |
删除文件中的内容 |
p |
print 打印 |
d |
delete 删除 |
过滤出含有 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
[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
[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@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
[root@arslinux-01 sed]# sed -n '2'p test.txt
bin:x:1:1:bin:/bin:/sbin/nologin
[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
[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 ‘行数范围s/被替换字符/要替换成的字符/g’ 文件名(不指定范围就是全部)
s/1/2/ 替换的内容
g 复制/追加hold space的内容到pattern space
[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 脱义
参考:http://man.linuxde.net/sed
9.6/9.7 awk
-
awk -F ‘分隔符’ ‘{print $数字}’ 打印出第几段(不删文件内容,$0指全部内容)
awk 无需脱义
- 常用命令选项:
选项 |
含义 |
-F fs |
fs指定输入分隔符,fs可以是字符串或正则表达式,如-F: |
-v var=value |
赋值一个用户定义变量,将外部变量传递给awk |
-f scripfile |
从脚本文件中读取awk命令 |
-m[fr] val |
对val值设置内在限制,-mf选项限制分配给val的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准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 匹配
[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
[root@arslinux-01 awk]# awk -F ':' '$1 ~ /oo/' passwd
root:x:0:0:root:/root:/bin/bash
~ 表示匹配,后接匹配的内容
[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
[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@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 数学运算表达式
[root@arslinux-01 awk]# awk -F : '$3==1000' passwd
arslinux:x:1000:1000::/home/arslinux:/bin/bash
如果只写一个 = ,那么会把所有行第三段赋值成 1000 并打印
- 匹配第三段 = 1000 的行,并打印出第 1 和 7 段
[root@arslinux-01 awk]# awk -F : '$3==1000{print $1,$7}' passwd
arslinux /bin/bash
[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
[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
[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
[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
上面两种是同一个意思,前一种更规整
[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
[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