awk取行取列

根据条件,再{执行动作}

AWK运算符说明
NRnumber 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值