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

匹配第一段至少有2o的行

[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

匹配第一段至少有2o的行

[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码排序;

例如比较211时会一位一位比较,比较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的条件括起来;

OFSprint打印时指定分隔符,通常伴随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且第一段为rootsync的行

[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段为rootsync的行

[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