9.6 awk(上)
-F 指定分隔符,打印每一行第一段
[root@hyc-01-01 awk]# awk -F ':' '{print $1}' test.txt
打印每一行所有的段
[root@hyc-01-01 awk]# awk -F ':' '{print $0}' test.txt
打印文件所有内容
[root@hyc-01-01 awk]# awk '{print $0}' test.txt
若不使用-F指定分隔符,则将把空格或空白字符当做分隔符打印
[root@hyc-01-01 awk]# cat 11.txt
aa bb cc
dd ee ff
gg vv hh
[root@hyc-01-01 awk]# awk '{print $1}' 11.txt
aa
dd
gg 此时以空格作为分隔符
打印多段内容
[root@hyc-01-01 awk]# awk '{print $1,$3}' 11.txt
aa cc
dd ff
gg hh
在显示的结果中加入符号(符号需要引起来)
[root@hyc-01-01 awk]# awk '{print $1"#"$3}' 11.txt
aa#cc
dd#ff
gg#hh
匹配包含oo的行
[root@hyc-01-01 awk]# awk '/oo/' 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
匹配第一段包含oo的行
[root@hyc-01-01 awk]# awk -F ':' '$1 ~ /oo/' test.txt
root:x:0:0:root:/root:/bin/bash
匹配第一段至少有一个o的行
[root@hyc-01-01 awk]# awk -F ':' '$1 ~ /o+/' test.txt
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:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
匹配第一段至少有2个o的行
[root@hyc-01-01 awk]# awk -F ':' '$1 ~ /oo+/' test.txt
root:x:0:0:root:/root:/bin/bash
匹配root的行打印第1和第3段,匹配hyc的行打印第6和第7段
[root@hyc-01-01 awk]# awk -F ':' '/root/ {print $1,$3} /hyc/ {print $6"#"$7}' test.txt
root 0
operator 11
/home/hyc/#/bin/bash
$0表示一行的所有内容,即每一段
匹配第3段等于0的行并打印该行的第1段
[root@hyc-01-01 awk]# awk -F ':' '$3==0 {print $1}' test.txt
Root
匹配第3段等于0的行并打印该行
[root@hyc-01-01 awk]# awk -F ':' '$3==0' test.txt
root:x:0:0:root:/root:/bin/bash
= 表示赋值,为某个变量赋值时使用
== 表示等号
匹配第3段大于等于1000的行并打印该行
[root@hyc-01-01 awk]# awk -F ':' '$3>=1000' test.txt
hyc1:x:1000:1000:/home/hyc1/:/bin/bash
在和数字比较时,若把比较的数字用双引号引起来后,那么awk不会认为是数字,而认为是字符,不加双引号则认为是数字
[root@hyc-01-01 awk]# awk -F ':' '$3>="1000"' 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
…
匹配第7段不是/sbin/nologin的行并打印匹配行
[root@hyc-01-01 awk]# awk -F ':' '$7!="/sbin/nologin" {print $0}' test.txt
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
hyc:x:999:999::/home/hyc/:/bin/bash
hyc1:x:1000:1000:/home/hyc1/:/bin/bash
!= 代表不等于;
匹配字符串时需要加双引号;
9.7 awk(下)
9.6 awk(上)
-F 指定分隔符,打印每一行第一段
[root@hyc-01-01 awk]# awk -F ':' '{print $1}' test.txt
打印每一行所有的段
[root@hyc-01-01 awk]# awk -F ':' '{print $0}' test.txt
打印文件所有内容
[root@hyc-01-01 awk]# awk '{print $0}' test.txt
若不使用-F指定分隔符,则将把空格或空白字符当做分隔符打印
[root@hyc-01-01 awk]# cat 11.txt
aa bb cc
dd ee ff
gg vv hh
[root@hyc-01-01 awk]# awk '{print $1}' 11.txt
aa
dd
gg 此时以空格作为分隔符
打印多段内容
[root@hyc-01-01 awk]# awk '{print $1,$3}' 11.txt
aa cc
dd ff
gg hh
在显示的结果中加入符号(符号需要引起来)
[root@hyc-01-01 awk]# awk '{print $1"#"$3}' 11.txt
aa#cc
dd#ff
gg#hh
匹配包含oo的行
[root@hyc-01-01 awk]# awk '/oo/' 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
匹配第一段包含oo的行
[root@hyc-01-01 awk]# awk -F ':' '$1 ~ /oo/' test.txt
root:x:0:0:root:/root:/bin/bash
匹配第一段至少有一个o的行
[root@hyc-01-01 awk]# awk -F ':' '$1 ~ /o+/' test.txt
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:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
匹配第一段至少有2个o的行
[root@hyc-01-01 awk]# awk -F ':' '$1 ~ /oo+/' test.txt
root:x:0:0:root:/root:/bin/bash
匹配root的行打印第1和第3段,匹配hyc的行打印第6和第7段
[root@hyc-01-01 awk]# awk -F ':' '/root/ {print $1,$3} /hyc/ {print $6"#"$7}' test.txt
root 0
operator 11
/home/hyc/#/bin/bash
$0表示一行的所有内容,即每一段
匹配第3段等于0的行并打印该行的第1段
[root@hyc-01-01 awk]# awk -F ':' '$3==0 {print $1}' test.txt
Root
匹配第3段等于0的行并打印该行
[root@hyc-01-01 awk]# awk -F ':' '$3==0' test.txt
root:x:0:0:root:/root:/bin/bash
= 表示赋值,为某个变量赋值时使用
== 表示等号
匹配第3段大于等于1000的行并打印该行
[root@hyc-01-01 awk]# awk -F ':' '$3>=1000' test.txt
hyc1:x:1000:1000:/home/hyc1/:/bin/bash
在和数字比较时,若把比较的数字用双引号引起来后,那么awk不会认为是数字,而认为是字符,不加双引号则认为是数字
[root@hyc-01-01 awk]# awk -F ':' '$3>="1000"' 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
…
匹配第7段不是/sbin/nologin的行并打印匹配行
[root@hyc-01-01 awk]# awk -F ':' '$7!="/sbin/nologin" {print $0}' test.txt
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
hyc:x:999:999::/home/hyc/:/bin/bash
hyc1:x:1000:1000:/home/hyc1/:/bin/bash
!= 代表不等于;
匹配字符串时需要加双引号;
9.7 awk(下)
将同一文件的两个段做数字比较,第三段小于第四段的行
[root@hyc-01-01 awk]# 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@hyc-01-01 awk]# awk -F ':' '$3==$4' test.txt
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
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
hyc:x:999:999::/home/hyc/:/bin/bash
hyc1:x:1000:1000:/home/hyc1/:/bin/bash
按ASCII码排序比较第三段在码表中排序大于5且小于7的行
[root@hyc-01-01 awk]# awk -F ':' '$3>"5" && $3<"7"' test.txt
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
focus:x:69:333:ad:/:/bin/bash
加上双引号后,这个数字就会被认为是普通字符;
这样比较大小是按ASCII码排序;
例如比较2和11时会一位一位比较,比较2大还是1大;
第三段数字大于1000或第七段内容为/sbin/nologin的行
[root@hyc-01-01 awk]# awk -F ':' '$3>1000 || $7=="/sbin/nologin"' 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
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:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
第3段数值大于1000或第7段匹配bash的行
[root@hyc-01-01 awk]# awk -F ':' '$3>1000 || $7 ~ /bash/' test.txt
root:x:0:0:root:/root:/bin/bash
focus:x:69:333:ad:/:/bin/bash
hyc:x:999:999::/home/hyc/:/bin/bash
hyc1:x:1000:1000:/home:/hyc1/:/bin/bash
指定匹配时用:分段,输出打印时用#分段
[root@hyc-01-01 awk]# awk -F ':' '{OFS="#"} $3>1000 || $7 ~ /bash/ {print $1,$3,$7}' test.txt
root#0#/bin/bash
focus#69#/bin/bash
hyc#999#/bin/bash
hyc1#1000#/bin/bash
不写匹配条件时则默认匹配文件中所有的行
[root@hyc-01-01 awk]# awk -F ':' '{OFS="#"} {print $1,$3,$7}' test.txt
在单引号内先写打印时使用的分隔符(OFS),再写匹配条件,最后写打印内容;
不指定打印内容时OFS会失效;
[root@hyc-01-01 awk]# awk -F ':' '{OFS="#"} $3>1000 || $7 ~ /bash/' test.txt
root:x:0:0:root:/root:/bin/bash
focus:x:69:333:ad:/:/bin/bash
hyc:x:999:999::/home/hyc/:/bin/bash
hyc1:x:1000:1000:/home:/hyc1/:/bin/bash
嵌套if语句
[root@hyc-01-01 awk]# awk -F ':' '{OFS="#"} {if($3>1000 || $7 ~ /bash/) {print $1,$3,$7}}' test.txt
root#0#/bin/bash
focus#69#/bin/bash
hyc#999#/bin/bash
hyc1#1000#/bin/bash
这条语句的作用与上上上条的语句相同;
加了if就要多加一些东西,如{}将if语句和print括起来,()将if的条件括起来;
OFS在print打印时指定分隔符,通常伴随print一起出现,属于内置变量;
打印所有的行并在每行开头加上NR(行号)和:
[root@hyc-01-01 awk]# awk -F ':' '{print NR":"$0}' test.txt
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
…
[root@hyc-01-01 awk]# awk -F ':' '{print NF":"$0}' test.txt
7:root:x: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
…
NR表示行号,NF表示一行有几段,都属于内置变量;
NR:写法相当于grep –n;
打印文件中前十行的所有内容
[root@hyc-01-01 awk]# awk -F ':' 'NR<=10 {print NR":"$0}' test.txt
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
打印行号前10且第一段为root或sync的行
[root@hyc-01-01 awk]# awk -F ':' 'NR<=10 && $1 ~ /root|sync/ {print NR":"$0}' test.txt
1:root:x:0:0:root:/root:/bin/bash
6:sync:x:5:0:sync:/sbin:/bin/sync
打印被分隔符分为6段且第1段为root或sync的行
[root@hyc-01-01 awk]# awk -F ':' 'NR==6 && $1 ~ /root|sync/ {print NR":"$0}' test.txt
6:sync:x:5:0:sync:/sbin:/bin/sync
[root@hyc-01-01 awk]# awk -F ':' '{print $NR":"$NF}' test.txt
root:/bin/bash
x:/sbin/nologin
2:/sbin/nologin
4:/sbin/nologin
lp:/sbin/nologin
/sbin:/bin/sync
/sbin/shutdown:/sbin/shutdown 这里是第7行
:/sbin/halt 这里是第8行,$NR应等于$8,但该行没有第8段,所以无法再打印
:/sbin/nologin
:/sbin/nologin
:/sbin/nologin
:/sbin/nologin
:/sbin/nologin
:/sbin/nologin
:/bin/bash
:/sbin/nologin
:/sbin/nologin
:/sbin/nologin
:/sbin/nologin
:/sbin/nologin
:/bin/bash
:/bin/bash
NF始终等于7
查看文件前3行,将查看的内容用:分隔,并给第1段赋值root
[root@hyc-01-01 awk]# head -n 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@hyc-01-01 awk]# head -n 3 test.txt |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
将文件中每一行第3列的数值求和
[root@hyc-01-01 awk]# awk -F ':' '{(tot=tot+$3)};END {print tot}' test.txt
4673
打印出第1段为root的行
[root@hyc-01-01 awk]# awk -F ':' '{if($1=="root"){print $0}}' test.txt
root:x:0:0:root:/root:/bin/bash