0911课的预习任务

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 脱义

参考:http://man.linuxde.net/sed


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


上一篇:Linux 篇 | 文本处理三剑客之SED


下一篇:0409课的预习任务