本文作者:不许人间见白头

Linux之如何使用Awk命令

不许人间见白头 2个月前 ( 12-13 ) 88

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.txt

systemd-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

文章版权及转载声明

作者:不许人间见白头本文地址:https://www.ahaoyw.com/article/51.html发布于 2个月前 ( 12-13 )
文章转载或复制请以超链接形式并注明出处阿豪运维笔记

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏