根据条件,再{执行动作}
AWK运算符 | 说明 |
---|---|
NR | number of record,取指定行 |
>= | 大于等于 |
<= | 小于等于 |
!= | 不低于 |
&& | 且,and符 |
|| | 或者 |
!/XX/ | 不包含XX的行 |
awk查找想要的行
NR参数 | 说明 |
---|---|
‘NR==X’ | 只输出第X行 |
‘NR>=X’ | 输出第X行及以后 |
‘NR>=X && NR<=Y’ | 输出第X行到第Y行 |
NF | 最后一行 |
awk根据行号查找时,只需用NR==行号
[root@vv~]# head -1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
# 只显示第一行
[root@vv~]# awk 'NR==1' /etc/passwd
root:x:0:0:root:/root:/bin/bash
查找包含指定关键词的行,这个类似和grep
很相似
[root@vv~]# egrep 'root|wzy' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
wzy:x:1000:1000::/home/wzy:/bin/bash
[root@vv~]# awk '/root/;/wzy/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
wzy:x:1000:1000::/home/wzy:/bin/bash
- awk显示行号
NR为当前行,$0输出一整行
awk 'NR==4 {print NR, $0}' filename
awk查找想要的列
指定列参数 | |
---|---|
'{print $5,7} | 输出第五列和第七列 |
‘{print $5 7}’ | 第五列后紧随着7这个数字 |
‘{print $“_”$7}’ | ""指定输出的列之间的分隔符,\t tab对齐 |
‘{print $NF}’ | 输出最后一列 |
NF | 每行有多少列(Number of field),NF0表示每行的全部列即输出全部 |
‘ 4 / e n d 4~/end 4 /end/’ | 对输出的列进行正则匹配。以end$结尾的列 |
-
awk对于列的定义是,字符之间有空格或制表符分隔。这个规则也可以使用 参数
-F
指定分隔符。 -
也可以先筛选行,然后再对筛选出来的行做处理。
根据字符判断列
用了默认的分隔符,所以打印了一整行
[root@vv~]# awk 'NR==1 {print $1}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
例如查看passwd文件中的用户名,先冒号指定分隔符,再打印第一列
[root@vv~]# awk -F : 'NR==1 {print $1}' /etc/passwd
root
分隔符不一定只有1个,也可以指定多个
[root@qwert test]# ip a s ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:c9:ae:86 brd ff:ff:ff:ff:ff:ff
inet 192.168.43.70/24 brd 192.168.43.255 scope global noprefixroute ens33
[root@qwert test]# ip a s ens33|awk NR==3|awk -F '[ /]+' '{print $3}'
192.168.43.70
如果要打印倒数第一行,用NF就可以表示,倒数第二行就是NF-1
[root@vv~]# echo '1 2 3 4 5'|awk '{print NF,(NF-1)}'
5 4
判断uid是否以4开头
[root@m01tmp]# awk -F: '$3 ~ /^4/ {print $0}' /etc/passwd
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
- 可以看到上述并未对齐,tab可以对齐
[root@qwert test]# ll |awk '{print $1"\t"$5}'
-rw-r--r--. 50
-rw-r--r--. 2389
column
对齐文本[root@qwert test]# ll |awk ‘{print $1"#"$5}’|column \t对齐文本
-rw-r–r–. 50
-rw-r–r–. 2389
根据条件判断列
大小判断
- 找出passwd文件中root ID大于1000的列
- 条件:>1000
- 输出结果=3列
[root@qwert test]# awk -F ':' '$3>1000 {print $3}' passwd
65534
1001
[root@qwert test]# awk -F: '$3>1000' passwdno
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
u1:x:1001:1001::/home/u1:/bin/bash
根据判断结果执行动作
- 如果swap使用大于0,就输出提示
[root@qwert test]# free |awk 'NR==3 && $3<=0 {print "swap 没有使用"}'
swap no normaly
输出并进行计算
[root@Kylin1 ~]# echo 1qq 2rr 3rro 4rrr 555 666 |awk '{print $NF-1, $NF}'
665 666
- 对第4列进行求和
格式:
awk '{i=i+$X}END{print i}'
环境:把准备一个从Excel复制来的文本
#对第4列求和
[root@qwert test]# awk '{i=i+$4}END{print i}' excel
308
- 输出的列带上其他文本,这样就能达到sed批量执行命令效果
echo 'user1 user2 user3'|xargs -n1|awk '{print "useradd "$1}'|bash
BEGIN和END
- 在处理行之前和处理行之后执行动作
[root@wzyCentos test]# awk 'BEGIN{print "Hello"}{print $1}END{print "Game over"}' seq
Hello
1
2
3
Game over
- 直接打印输出
[root@m01~]# rpm -ql rsync|awk '{print "rm -f " $1}'
rm -f /etc/rsyncd.conf
rm -f /etc/sysconfig/rsyncd
rm -f /usr/bin/rsync
llo"}{print $1}END{print "Game over"}' seq
Hello
1
2
3
Game over
- 直接打印输出
[root@m01~]# rpm -ql rsync|awk '{print "rm -f " $1}'
rm -f /etc/rsyncd.conf
rm -f /etc/sysconfig/rsyncd
rm -f /usr/bin/rsync