awk(上)优化版
# head -n2 test.txt |awk -F ':' '{print $1}'其中-F选项的作用是用来指定分隔符的,如果不加-F选项,则以空格或者tab为分隔符,print为打印,用来打印某段,$1则为第一段,第二段则表示为$2,以此类推,其中$0比较特殊,他说表示整行,如下
# head -n2 test.txt |awk -F ':' '{print $0}'root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
awk格式,-F后面紧跟着单引号,单引号里面为分隔符,print要用{}括起来,否则会报错,其中print还可以打印自定义内容,但自定义内容要用双引号引起如下所示
# head -n2 test.txt |awk -F ':' '{print $1"-"$2"-"$3}'root-x-0
bin-x-1
匹配字符或者字符串
# 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
匹配关键字用法awk ‘/关键字/' 文件名称,他能实现grep的功能,但是没有颜色显示
# awk -F ':' '$1 ~/oo/' test.txt
root:x:0:0:root:/root:/bin/bash
他可以让某段去匹配,其中~是匹配的意思,
awk也是支持多次匹配的
# awk -F ':' '/root/ {print $1,$3} /test/ {print $1,$3}' test.txt他匹配玩/root 后再匹配test
awk(下)优化版
# awk -F ':' '$3=="0"' /etc/passwd
root:x:0:0:root:/root:/bin/bash
awk中可以用逻辑符号进行判断,比如==就是等于,可以理解为精确匹配,另外还有>,>=,<,<=,!=。值得注意的是,再和数字比较时候,若把比较的数字用双引号引起,那么awk不会认为是数字而会认为是字符,不加双引号则会认为是数字。
如打印第三段大于500的
# awk -F ':' '$3>=500' /etc/passwd
systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
chrony:x:997:995::/var/lib/chrony:/sbin/nologin
不匹配表示法
# awk -F ':' '$7 !="/sbin/nologin"' /etc/passwd
也可以两段间进行比较
# 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
也可以使用&&并且,,||或者
awk常用的内置变量有OFS,NF和NR,其中OFS和-F的选项有类似的功能,也是可以用来定义分隔符的,但是他是在输出的时候定义的,NF表示用分隔符分隔后一共有多少段,NR表示行号。
OFS用法如下
# head -n2 test.txt |awk -F ':' '{OFS="#"} {print $1,$3,$5}'root#0#root
bin#1#bin
高级的一些用法
# awk -F ':' '{OFS="#"} {if ($3>500) {print $1,$3,$5}}' test.txtsystemd-bus-proxy#999#systemd Bus Proxy
polkitd#998#User for polkitd
chrony#997#
NF的具体用法
# head -n2 test.txt |awk -F ':' '{print NF}'# head -n2 test.txt |awk -F ':' '{print $NF}'/bin/bash
/sbin/no0login
这里的NF是多少段,则$NF是最后一段的值
NR的具体用法
# head -n2 test.txt |awk -F ':' '{print NR}'还可以做为判断条件,
# awk 'NR>20' /etc/passwd
chrony:x:997:995::/var/lib/chrony:/sbin/nologin
也可以跟匹配一起用
# awk -F ':' 'NR<20 && $1 ~ /roo/' /etc/passwd
root:x:0:0:root:/root:/bin/bash

