linux 三剑客之一awk 使用简介
1.基本语法格式
awk '{pattern + action}' {filenames}
pattern 表示在数据中查找的内容 action 表示找到匹配内容时执行的命令。
pattern 如果是正则表达式 则用斜杠括起来。
通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。
1. awk '{print $0}' /etc/passwd
在 awk 中,如果只出现 print 命令,那么将打印当前行的全部内容。
2. awk '{if(NR>=20 && NR<=30) print $1}' test.txt
打印test.txt 第20行到30行的内容。
3. 从该文件中过滤出'Poe'字符串与33794712
[root@Gin scripts]# cat test.txt
I am Poe,my qq is 33794712
[root@Gin scripts]# awk -F '[ ,]+' '{print $3" "$7}' test.txt
Poe 33794712
4.
2. 实例
1.统计/etc/passwd的账户人数
[root@Gin scripts]# awk '{count++;print $0;} END{print "user count is ",count}' passwd
root:x:0:0:root:/root:/bin/bash
..............................................
user count is 27
count是自定义变量。之前的action{}里都是只有一个print,其实print只是一个语句,而action{}可以有多个语句,以;号隔开。这里没有初始化count,虽然默认是0,但是妥当的做法还是初始化为0:
[root@Gin scripts]# awk 'BEGIN {count=0;print "[start] user count is ",count} {count=count+1;print $0} END{print "[end] user count is ",count}' passwd
[start] user count is 0
root:x:0:0:root:/root:/bin/bash
...................................................................
[end] user count is 27
2. 统计某个文件夹下的文件占用的字节数
[root@Gin scripts]# ll |awk 'BEGIN{size=0;} {size=size+$5;} END{print "[end]size is ",size/1024/1024,"M"}'
[end]size is 0.00142002 M
awk中常用运算符
awk 中内置变量
awk 正则表达式
规则表达式
awk '/REG/{action} ' file,/REG/为正则表达式,可以将$0 中,满足条件的记录送入到:action 进行处理
举例:
[root@Gin scripts]# awk '/root/{print $0}' passwd ##匹配所有包含root的行
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@Gin scripts]# awk -F: '$5~/root/{print $0}' passwd ## 以分号作为分隔符,匹配第5个字段是root的行
root:x:0:0:root:/root:/bin/bash
布尔表达式
awk '布尔表达式{action}' file 仅当对前面的布尔表达式求值为真时, awk 才执行代码块
[root@Gin scripts]# awk -F: '$1=="root"{print $0}' passwd
root:x:0:0:root:/root:/bin/bash
awk 查看服务器状态并汇总
netstat -an|awk '/^tcp/{++s[$NF]}END{for(a in s)print a,s[a]}'
ESTABLISHED 1
LISTEN 20