六周第三次课

9.6/9.7 awk

[root@aiker02 ~]#  head -n2 test.txt|awk -F ':' '{print $1}'  # 查看前两行,以:为分隔符,输出分割域1
rtoo
bin

[root@aiker02 ~]#  head -n2 test.txt|awk -F ':' '{print $0}'  # 查看前两行,以:为分隔符,输出整行,$0位整行
rtoo:x:0:0:rtoo:/rtoo:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

[root@aiker02 ~]#  awk -F ':' '{print $1"#"$2"#"$3"#"$4}' test.txt  # 以:为分隔符显示,并以#重新连接
rtoo#x#0#0
bin#x#1#1
daemon#x#2#2
adm#x#3#4
lp#x#4#7
sync#x#5#0
shutdown#x#6#0
halt#x#7#0
mail#x#8#12
operator#x#11#0
games#x#12#100
ftp#x#14#50
nobody#x#99#99

[root@aiker02 ~]#  awk '/oo/' test.txt # 输出有oo的行
rtoo:x:0:0:rtoo:/rtoo:/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:/rtoo:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin

[root@aiker02 ~]#  awk -F ':' '$1 ~/oo/' test.txt # 输出分割域1有oo的行
rtoo:x:0:0:rtoo:/rtoo:/bin/bash

[root@aiker02 ~]#  awk -F ':' '/root/ {print $1,$3} /test/ {print $1,$3}' test.txt # 查询包含root和test的行,并输出分割域1和3

[root@aiker02 ~]#  awk -F ':' '$3=="0"' /etc/passwd # 输出分割域3是0的行
root:x:0:0:root:/root:/bin/bash

[root@aiker02 ~]#  awk -F ':' '$3>="500"' /etc/passwd # 显示分割域3大于等于500的行
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
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-bus-proxy:x:999:998:systemd Bus Proxy:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:998:997:User for polkitd:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/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:997:995::/var/lib/chrony:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin

[root@aiker02 ~]#  awk -F ':' '$3>=500' /etc/passwd # 输出分割域3的值大于等于500的行
systemd-bus-proxy:x:999:998:systemd Bus Proxy:/:/sbin/nologin
polkitd:x:998:997:User for polkitd:/:/sbin/nologin
chrony:x:997:995::/var/lib/chrony:/sbin/nologin

[root@aiker02 ~]#  awk -F ':' '$7!="/sbin/nologin"' /etc/passwd # 分割域7不是"/sbin/nologin"的行

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

[root@aiker02 ~]#  awk -F ':' '$3<$4' /etc/passwd # 分割域3的值小于4的行
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

[root@aiker02 ~]#  awk -F ':' '$3>"5" && $3<"7"' /etc/passwd # 输出分割域3大于5小于7的行
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin

[root@aiker02 ~]#  awk -F ':' '$3>1000 || $7=="/bin/bash"' /etc/passwd # 分割域3大于1000或者分割域7是/bin/bash的行
root:x:0:0:root:/root:/bin/bash

[root@aiker02 ~]#  head -5 /etc/passwd |awk -F ':' '{OFS="#"} {print $1,$3,$4}'  # 前五行,用#替换:作为分隔符显示
root#0#0
bin#1#1
daemon#2#2
adm#3#4
lp#4#7

[root@aiker02 ~]#  awk -F ':' '{OFS="#"} {if ($3>1000) {print $1,$2,$3,$4}}' /etc/passwd # 如果分割域3大于1000,用#替换分隔符:,显示分割域1234

[root@aiker02 ~]#  head -n3 /etc/passwd | awk -F ':' '{print NF}'  # NF显示多少分割域
7
7
7

[root@aiker02 ~]#  head -n3 /etc/passwd | awk -F ':' '{print NR}'  # 显示行号多少
1
2
3

[root@aiker02 ~]#  awk 'NR>40' /etc/passwd # 显示40行后的行

[root@aiker02 ~]#  awk -F ':' 'NR<20 && $1 ~ /roo/' /etc/passwd # 显示20行内,分割域包含roo的行
root:x:0:0:root:/root:/bin/bash

[root@aiker02 ~]#  head -n 3 /etc/passwd |awk -F ':' '$1="root"' # 前三行,分割域是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@aiker02 ~]#  awk -F ':' '{(tot=tot+$3)}; END {print tot}' /etc/passwd # 求分割域3的总和
3799

[root@aiker02 ~]#  awk -F ':' '{if ($1=="root") {print $0}}' /etc/passwd # 如果分割域1是root,输出整行
root:x:0:0:root:/root:/bin/bash

扩展

把这里面的所有练习题做一下
http://www.apelearn.com/study_v2/chapter14.html

sed练习题

把/etc/passwd 复制到/root/test.txt,用sed打印所有行


cp /etc/passwd ./test.txt

[root@aiker02 ~]# sed -n '1,$'p test.txt 
rtoo:x:0:0:rtoo:/rtoo:/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

打印test.txt的3到10行

[root@aiker02 ~]# sed -n '3,10'p test.txt 
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:/rtoo:/sbin/nologin

打印test.txt 中包含 ‘root’ 的行

[root@aiker02 ~]# sed -n '/root/'p test.txt
删除test.txt 的15行以及以后所有行

[root@aiker02 ~]# sed '15,$'d test.txt 
rtoo:x:0:0:rtoo:/rtoo:/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:/rtoo:/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-bus-proxy:x:999:998:systemd Bus Proxy:/:/sbin/nologin

删除test.txt中包含 ‘bash’ 的行

[root@aiker02 ~]# sed '/bash/'d 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
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:/rtoo:/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-bus-proxy:x:999:998:systemd Bus Proxy:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:998:997:User for polkitd:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/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:997:995::/var/lib/chrony:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
1a2w3e4r5t
sed1111
1111

替换test.txt 中 ‘root’ 为 ‘toor’

[root@aiker02 ~]# sed 's/root/toor/'g test.txt 
toor:x:0:0:toor:/rtoo:/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:/rtoo:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

替换test.txt中 ‘/sbin/nologin’ 为 ‘/bin/login’

[root@aiker02 ~]# sed 's#/sbin/nologin#/bin/login#'g test.txt 
root:x:0:0:root:/rtoo:/bin/bash
bin:x:1:1:bin:/bin:/bin/login
daemon:x:2:2:daemon:/sbin:/bin/login
adm:x:3:4:adm:/var/adm:/bin/login
lp:x:4:7:lp:/var/spool/lpd:/bin/login
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:/bin/login
operator:x:11:0:operator:/rtoo:/bin/login
games:x:12:100:games:/usr/games:/bin/login
ftp:x:14:50:FTP User:/var/ftp:/bin/login
nobody:x:99:99:Nobody:/:/bin/login

删除test.txt中5到10行中所有的数字

[root@aiker02 ~]# sed -r '5,10s/[0-9]//'g test.txt 
root:x:0:0:root:/rtoo:/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:::lp:/var/spool/lpd:/sbin/nologin
sync:x:::sync:/sbin:/bin/sync
shutdown:x:::shutdown:/sbin:/sbin/shutdown
halt:x:::halt:/sbin:/sbin/halt
mail:x:::mail:/var/spool/mail:/sbin/nologin
operator:x:::operator:/rtoo:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin

删除test.txt 中所有特殊字符(除了数字以及大小写字母)

[root@aiker02 ~]# sed 's/[^0-9A-Za-z]//'g test.txt  
rootx00rootrtoobinbash
binx11binbinsbinnologin
daemonx22daemonsbinsbinnologin
admx34admvaradmsbinnologin
lpx47lpvarspoollpdsbinnologin
syncx50syncsbinbinsync
shutdownx60shutdownsbinsbinshutdown
haltx70haltsbinsbinhalt
mailx812mailvarspoolmailsbinnologin
operatorx110operatorrtoosbinnologin
gamesx12100gamesusrgamessbinnologin
ftpx1450FTPUservarftpsbinnologin
nobodyx9999Nobodysbinnologin

把test.txt中第一个单词和最后一个单词调换位置


[root@aiker02 ~]# sed 's/\(^[0-9a-zA-Z]\+\)\([^0-9a-zA-Z].*[^0-9a-zA-Z]\)\([a-zA-Z]*$\)/\3\2\1/' test.txt    bash:x:0:0:root:/rtoo:/bin/root
nologin:x:1:1:bin:/bin:/sbin/bin
nologin:x:2:2:daemon:/sbin:/sbin/daemon
nologin:x:3:4:adm:/var/adm:/sbin/adm
nologin:x:4:7:lp:/var/spool/lpd:/sbin/lp
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
nologin:x:8:12:mail:/var/spool/mail:/sbin/mail
nologin:x:11:0:operator:/rtoo:/sbin/operator

把test.txt中出现的第一个数字和最后一个单词替换位置

[root@aiker02 ~]# sed 's/\([^0-9]\+\)\([0-9]\+\)\(.*[^0-9a-zA-Z]\)\([a-zA-Z0-9]*$\)/\1\4\3\2/' test.txt     
root:x:bash:0:root:/rtoo:/bin/0
bin:x:nologin:1:bin:/bin:/sbin/1
daemon:x:nologin:2:daemon:/sbin:/sbin/2
adm:x:nologin:4:adm:/var/adm:/sbin/3
lp:x:nologin:7:lp:/var/spool/lpd:/sbin/4
sync:x:sync:0:sync:/sbin:/bin/5
shutdown:x:shutdown:0:shutdown:/sbin:/sbin/6
halt:x:halt:0:halt:/sbin:/sbin/7
mail:x:nologin:12:mail:/var/spool/mail:/sbin/8
operator:x:nologin:0:operator:/rtoo:/sbin/11
games:x:nologin:100:games:/usr/games:/sbin/12
ftp:x:nologin:50:FTP User:/var/ftp:/sbin/14
nobody:x:nologin:99:Nobody:/:/sbin/99
systemd-bus-proxy:x:nologin:998:systemd Bus Proxy:/:/sbin/999
systemd-network:x:nologin:192:systemd Network Management:/:/sbin/192
dbus:x:nologin:81:System message bus:/:/sbin/81
polkitd:x:nologin:997:User for polkitd:/:/sbin/998

把test.txt 中第一个数字移动到行末尾

[root@aiker02 ~]# sed 's/\([^0-9]\+\)\([0-9]\+\)\(.*$\)/\1\3\2/' test.txt                               
root:x::0:root:/rtoo:/bin/bash0
bin:x::1:bin:/bin:/sbin/nologin1
daemon:x::2:daemon:/sbin:/sbin/nologin2
adm:x::4:adm:/var/adm:/sbin/nologin3
lp:x::7:lp:/var/spool/lpd:/sbin/nologin4
sync:x::0:sync:/sbin:/bin/sync5
shutdown:x::0:shutdown:/sbin:/sbin/shutdown6
halt:x::0:halt:/sbin:/sbin/halt7
mail:x::12:mail:/var/spool/mail:/sbin/nologin8
operator:x::0:operator:/rtoo:/sbin/nologin11
games:x::100:games:/usr/games:/sbin/nologin12
ftp:x::50:FTP User:/var/ftp:/sbin/nologin14
nobody:x::99:Nobody:/:/sbin/nologin99
systemd-bus-proxy:x::998:systemd Bus Proxy:/:/sbin/nologin999
systemd-network:x::192:systemd Network Management:/:/sbin/nologin192
dbus:x::81:System message bus:/:/sbin/nologin81
polkitd:x::997:User for polkitd:/:/sbin/nologin998

在test.txt 20行到末行最前面加 ‘aaa:’

[root@aiker02 ~]# sed '20,$s/^/aaa:/'g test.txt 
root:x:0:0:root:/rtoo:/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:/rtoo:/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-bus-proxy:x:999:998:systemd Bus Proxy:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:998:997:User for polkitd:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
aaa:postfix:x:89:89::/var/spool/postfix:/sbin/nologin
aaa:chrony:x:997:995::/var/lib/chrony:/sbin/nologin
aaa:ntp:x:38:38::/etc/ntp:/sbin/nologin
aaa:nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
aaa:tcpdump:x:72:72::/:/sbin/nologin
aaa:1a2w3e4r5t
aaa:sed1111
aaa:1111

awk练习题

用awk 打印整个test.txt (以下操作都是用awk工具实现,针对test.txt)

[root@aiker02 ~]# awk '{print $0}' test.txt 
root:x:0:0:root:/rtoo:/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:/rtoo:/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

查找所有包含 ‘bash’ 的行

[root@aiker02 ~]# awk '/bash/' test.txt
root:x:0:0:root:/rtoo:/bin/bash

用 ‘:’ 作为分隔符,查找第三段等于0的行

[root@aiker02 ~]# awk -F ':' '$3=="0"' test.txt            
root:x:0:0:root:/rtoo:/bin/bash

用 ‘:’ 作为分隔符,查找第一段为 ‘root’ 的行,并把该段的 ‘root’ 换成 ‘toor’ (可以连同sed一起使用)

[root@aiker02 ~]# awk -F ':' '$1=="root"' test.txt | sed 's/root/toor/'
toor:x:0:0:root:/rtoo:/bin/bash

用 ‘:’ 作为分隔符,打印最后一段

[root@aiker02 ~]# awk -F ':' '{print $NF}' test.txt 
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/sync
/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
/sbin/nologin

打印行数大于20的所有行

[root@aiker02 ~]# awk -F ':' 'NR>20' test.txt 
chrony:x:997:995::/var/lib/chrony:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
1a2w3e4r5t
sed1111

用 ‘:’ 作为分隔符,打印所有第三段小于第四段的行

[root@aiker02 ~]# awk -F ':' '$3 < $4' test.txt 
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
[root@aiker02 ~]# 

用 ‘:’ 作为分隔符,打印第一段以及最后一段,并且中间用 ‘@’ 连接 (例如,第一行应该是这样的形式 'root@/bin/bash‘ )

[root@aiker02 ~]# awk -F ':' '{print $1"@"$NF}' test.txt   
root@/bin/bash
bin@/sbin/nologin
daemon@/sbin/nologin
adm@/sbin/nologin
lp@/sbin/nologin
sync@/bin/sync
shutdown@/sbin/shutdown
halt@/sbin/halt
mail@/sbin/nologin
operator@/sbin/nologin
games@/sbin/nologin
ftp@/sbin/nologin
nobody@/sbin/nologin
systemd-bus-proxy@/sbin/nologin
systemd-network@/sbin/nologin
dbus@/sbin/nologin
polkitd@/sbin/nologin
tss@/sbin/nologin

用 ‘:’ 作为分隔符,把整个文档的第四段相加,求和

[root@aiker02 ~]# awk -F ':' '{(TOT=TOT+$4)} END {print TOT}' test.txt 
3898

[root@aiker02 ~]# awk -F ':' '{(sum+=$4)} END {print sum}' test.txt  
3898

猜你喜欢

转载自blog.51cto.com/235571/2107057