轻松玩转awk
awk的处理方式
awk一次处理一行内容
awk对每行可以进行切片处理
例如
awk -F ':' '{print $1}' /etc/password
-F
指定每一行分割符号,这样就把被每行被:
分割的第一个单词输出了
如果不指定默认是以空格作为分割的
awk的格式
awk [options] 'command' file
另外 command
还可以分为(正则表达式,逻辑判断式)和(awk操作命令)
command:pattern {awk操作命令}
对应上面的命令 指定分隔符 -F ':'
相当于 [options]
{print $1}
相当于command中的 awk操作命令
至于 patterrn 部分后面介绍
awk内置参数
NR: 每行的行号
NF:每行的字段数量(被分割成多少段)
FILENAME:操作的文件名
例如:
awk -F ':' '{print NR,NF}' /etc/passwd
输出:
1 7
2 7
3 7
4 7
......
......
40 7
41 7
42 7
43 7
44 7
可以看到 文件一共有44行
每一行被分割成 7段
这里的,
相当于空格分割
awk中的if else语句
awk -F ':' '{if($3>100)print}' /etc/passwd
输出 uid
大于100的行
(print不加参数可以输出一整行,或者print$0也可以输出一整行)
另外也可以用到 else语句
awk -F ':' '{if($3>100)print;else print"uid小于100"}' /etc/passwd
记得加分号
awk中的 parttern
还记的我们前面挖的坑吗,patterrn还没有介绍
逻辑判断式
awk -F ':' '$3>100{print}' /etc/passwd
正则表达式
awk中的正则可以匹配一行中的字段
awk -F ':' '$1~/^r/{print $1}' /etc/passwd
匹配第一个字段 以 r
开头的每一行,然后输出出来第一个字段
正则表达式要在 / /
之间
要匹配的字段和正则之间要用 ~
连接
如果不匹配固定的字段,像这样
awk -F ':' '{print $1}' /etc/passwd
这种匹配就会匹配整行
BEGIN END语法
awk [options] BEGIN{awk操作命令} 'command' END{awk操作命令} file
BEGIN 后面执行的 awk 操作命令在文件没有输入的时候就执行了(这个时候是不能输出文件名的)
一般做统计的时候 初始化变量,或者输出表头
END 后面执行的操作也是在读取完文件的每一行后才执行的
所以 END 和 BEGIN 都是不参与循环的
awk的数组
用awk统计 netstat -apn
有多少 CONNET
和多少LISTEN
netstat -apn|awk '$6~/CONNECTED|LISTEN/{sum[$6]++}END{for(i in sum)print i,sum[i]}'
输出:
LISTEN 6
CONNECTED 803
这里可以看到 awk 的数组更类似于 python 中的字典,可以通过对应的 键访问到对应的值
本文来自博客园,作者:Hello_wshuo,转载请注明原文链接:https://www.cnblogs.com/Hellowshuo/p/15622228.html