awk命令用法

awk ‘条件1 {动作1} 条件2 {动作2} …’ filename
sed对一整行进行处理,awk将行分成一个个“字段”来处理。默认的字段分隔符为空格键或[Tab]键
在每一行的每个字段都有变量名称,分别对应$1,$2,……。$0代表一整行。
awk的几个内置变量

变量名称代表的意义
NF每一行($0)拥有的字段总数
NR目前awk所处理的是“第几行”数据
FS目前的分割字符,默认是空格键

查看文件

[root@lishan ~]# head -2 passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

取文件passwd第二行

[root@lishan ~]# awk -F: 'NR==2' passwd
bin:x:1:1:bin:/bin:/sbin/nologin
[root@lishan ~]# awk -F: NR==1 passwd
root:x:0:0:root:/root:/bin/bash

取文件passwd第一列

[root@lishan ~]# awk -F: '{print $1}' passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody

取文件passwd第二行第一列

[root@lishan ~]# awk -F: 'NR==2{print $1}' passwd
bin

取文件passwd第二行最后一列

[root@lishan ~]# awk -F: 'NR==1{print $NF}' passwd
/bin/bash

取文件passwd第二行倒数第二列

[root@lishan ~]# awk -F: 'NR==1{print $(NF-1)}' passwd
/root

取出IP地址用正则表达式
[ /]表示指定范围类任意一个字符,+表示匹配前面任意一个字符至少一次

[root@lishan ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:69:c9:c3 brd ff:ff:ff:ff:ff:ff
    inet 192.168.181.140/24 brd 192.168.181.255 scope global dynamic eth0
       valid_lft 1569sec preferred_lft 1569sec
    inet6 fe80::20c:29ff:fe69:c9c3/64 scope link 
       valid_lft forever preferred_lft forever
[root@lishan ~]# ip a|grep 'inet'|awk -F'[ /]+' 'NR==3{print $3}'
192.168.181.140

取出文件abc找到含有lishan一行的最后一列

[root@lishan ~]# cat abc
lishan 1 66 haha
zhaojing 2 78 enen
wangxuan 3 34 hehe
yangwei 4 45 wowo
lishan 5 67 loulou
[root@lishan ~]# awk '/lishan/{print $NF}' abc
haha

取出文件abc中含有lishan的一行的最后一列,并写入到文件的a中

[root@lishan ~]# awk '/l/ishan/{print $NF}' abc | tee a
haha
loulou
[root@lishan ~]# ls
a  abc  network.repo  nfs.sh  passwd  scp.exp  server.sh  ssh-keygen.exp  test.awk
[root@lishan ~]# cat a 
haha
loulou

同时取出两列中间要加入英文符号逗号会显示出空格

[root@lishan ~]# awk '{print $1,$2}' abc
lishan 1
zhaojing 2
wangxuan 3
yangwei 4
lishan 5
[root@lishan ~]# awk '{print $1$2}' abc
lishan1
zhaojing2
wangxuan3
yangwei4
lishan5

在awk命令中加入begin开始语句会在输出时显示begin里面的内容

[root@lishan ~]# awk 'BEGIN{print "name rank"} {print $1,$2}' abc
name rank
lishan 1
zhaojing 2
wangxuan 3
yangwei 4
lishan 5

在awk语句中加入end语句会在输出结尾处显示end里面的内容

[root@lishan ~]# awk 'BEGIN{print "name ran/k"} {print $1,$2} END{print "以上是全部学生"}' abc
name rank
lishan 1
zhaojing 2
wangxuan 3
yangwei 4
lishan 5
以上是全部学生

用脚本执行awk命令,在脚本中写入想要执行的命令

[root@lishan ~]# cat test.awk
#!/bin/bash/awk
{print $2}

用awk命令-f执行脚本并且加需要执行脚本的文件名

[root@lishan ~]# awk -f test.awk  abc
1
2
3
4
5

awk加入正则表达式(如果5小于29)就取出全部

[root@lishan ~]# awk '{if($5<29) print $0}' abc
lishan 1 66 haha
zhaojing 2 78 enen
wangxuan 3 34 hehe
yangwei 4 45 wowo
lishan 5 67 loulou

在abc文件的第二列查找有数字5的那一行并打印

[root@lishan ~]# awk '$2 ~ /5/{print $0}' abc
lishan 5 67 loulou

在abc文件的第二列中取出除去不含数字5的那一行并打印

[root@lishan ~]# awk '$2 !~ /5/{print $0}' abc
lishan 1 66 haha
zhaojing 2 78 enen
wangxuan 3 34 hehe
yangwei 4 45 wowo
[root@lishan ~]# awk '{if($2!~/5/)print $0}' abc
lishan 1 66 haha
zhaojing 2 78 enen
wangxuan 3 34 hehe
yangwei 4 45 wowo

取出文件中第一列以l开头n结尾的哪一行

[root@lishan ~]# awk '$1 ~ /^l....n$/' abc
lishan 1 66 haha
lishan 5 67 loulou

在文件第三列查找数字(66或者78)的哪一行并打印

[root@lishan ~]# awk '$3 ~ /(66|78)/' abc
lishan 1 66 haha
zhaojing 2 78 enen

查找文件以l开头的哪一行并打印

[root@lishan ~]# awk '/^l/' abc
lishan 1 66 haha
lishan 5 67 loulou

取出文件中以a结尾的哪一行

[root@lishan ~]# awk '/a$/' abc
lishan 1 66 haha

取出文件名

[root@lishan ~]# awk 'END{print FILENAME}' passwd
passwd

取出文件总行数

[root@lishan ~]# cat passwd |wc -l
31
[root@lishan ~]# awk 'END{print FNR}' passwd
31

取出文件的总列数,和行数

[root@lishan ~]# awk '{print NF,NR,$0}' abc
4 1 lishan 1 66 haha
4 2 zhaojing 2 78 enen
4 3 wangxuan 3 34 hehe
4 4 yangwei 4 45 wowo
4 5 lishan 5 67 loulou

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值