awk 是一个强大的文本分析工具,主要用于数据扫描、过滤、统计汇总工作,数据可以来自标准输入、管道或者文件。
首先理解一下两个概念:
-F
选项指定分隔符)语法:awk [选项] '/pattern1/{action1} /pattern2/{action2} ...' filename
选项:
-F
: 指定输入文件中每条记录的字段之间的分割符-v
: 定义一个用户变量awk 的内置变量
对 /etc/passwd
文件中,所有行中,以冒号(:
)为分隔符,的第 1 列和第 7 列,进行打印操作,注意 -F 与分隔符冒号(:
)之间的空格可用可不用。
$ cat /etc/passwd | awk -F : '{print $1,$7}'
root /bin/bash
daemon /usr/sbin/nologin
bin /usr/sbin/nologin
sys /usr/sbin/nologin
...省略输出...
- 因为没有指定/pattern/,也就是匹配每条记录的意思。
- print 操作符可以打印变量,如果变量之间用逗号(,)隔开,则打印出来的变量会自动以空格隔开两个变量。
对 /etc/passwd
文件中,以 bin 开头的行中,以冒号(:
)为分隔符,的第 1 列和第 7 列,进行打印操作
$ cat /etc/passwd | awk -F : '/^bin/{print $1 "," $7}'
bin,/usr/sbin/nologin
对 /etc/passwd
文件中,以 bin 开头的行中,以冒号(:
)为分隔符,的行号(用到内置变量 NR )以及第 1 列和第 7 列,进行打印操作
$ cat /etc/passwd | awk -F : '/^bin/{print NR "," $1 "," $7}'
3,bin,/usr/sbin/nologin
BEING 和 END
awk 可以通过 BEING
和 END
在分析读取文本之前以及之后执行一次 {action}
操作,一般用 BEGIN 来进行初始化,用 END 来进行汇总。
$ cat /etc/passwd | awk -F: 'BEGIN{print "打印 bin 用户登录权限"} /^bin/{print NR "," $1 "," $7} END{print "共有 "NR" 行"}'
打印 bin 用户登录权限
3,bin,/usr/sbin/nologin
共有 48 行
自定义用户变量
$ cat /etc/passwd | awk -v a="自定义变量" '{print a}'
自定义变量
自定义变量
自定义变量
...省略输出...
你会发现这条语句会打印48行的"自定义变量",因为它读取了48次(也就是每行都读取并打印一次)
分割符变量
awk 为输入、输出分隔符指定了变量名,并赋予了默认值,其中:
- RS :输入记录的分隔符,默认为行(\n);
- ORS :输出记录的分隔符,,默认也为行(\n);
- OFS :输出字段的分隔符,默认为空格。
为什么没有输入字段分割符的变量?因为这个分隔符是直接通过
-F
选项来指定的。
我们对上一条命令的输出记录分隔符指定为空格
$ cat /etc/passwd | awk -v a="自定义变量" -v ORS=" " '{print a}'
自定义变量 自定义变量 自定义变量 自定义变量 ...省略输出...
指定多个分隔符
awk 可以通过 []
来指定多个分割符,下面的命令指定了左中括号 ([
) 和右中括号 (]
) 作为分隔符。
$ echo [abc][def][ghi] | awk -F [][] '{print $2}'
abc