目录
AWK介绍
Linux中的AWS主要用于处理文本文件,标准化输出文本文件。Linux中默认自带的是gawk,兼容awk、nawk。
- awk--其命名是由三位创始人的Family Name首字母组成(Alfred Aho,Peter Weinberger,Brian Kernighan)。
- nawk--“New AWK”,AT&T版本实验室的AWS升级版。
- gawk--“GNU AWK”,Linux中默认自带的版本。也是功能最强大,社区最活跃的版本。和awk、nawk完全兼容。
- mawk--Ubuntu和Debian Linux上默认的awk,执行速度最快的版本。
基础语法
1.awk命令格式
awk [选项参数] 'awk脚本命令' 文件
2.选项参数
选项参数 | 说明 |
---|---|
-F [fs] | 指定分隔符,fs可以是一个字符串或者正则表达式。不指定fs默认用空格分隔。 |
-v var=value | 自定义变量。例:awk -v a=111 '{print $1,$2,a}' |
-f filename | 从文件中读取awk脚本。 |
-o --pretty-print | 将awk脚本输出到指定文件,如果不指定则输出到当前目录的awkprof.out文件。 |
3.内建变量
变量 | 说明 |
---|---|
$n | 第n个字段,字段由FS分隔。 |
$0 | 完整的输入记录。 |
$NF | 最后一个字段,字段由FS分隔。 |
NF | 一条记录,按FS分隔后的字段数目 |
NR | 行号(已读出的记录数),从1开始。 |
FS | 字段分隔符,默认是空格。 |
RS | 记录(行)分隔符,默认是换行符。 |
OFS | 输出字段分隔符,默认与输入字段分隔符(FS)一致。 例:awk 'OFS="-" {print $1,$2}' |
ORS | 输出记录(行)分隔符,默认是换行符。 |
FNR | 多个文件分别计数的行。 |
FILNAME | 当前文件名。 |
ARGC | 命令行参数数目。 |
ARGV | 命令行参数数组。 |
IGNORECASE | 如果是真,则忽略大小写匹配。 |
4.awk脚本命令
awk脚本命令主要分为三段:BEGIN{command}、/pattern/ {command} 、END{command}
awk 'BEGIN{command} /pattern/ {command} END{command}' file
- BEGIN{command} -- 执行程序启动时执行的代码,整个过程中只执行一次。可缺省。
- /pattern/ {command} -- /pattern/模式匹配,按字符串或正则匹配行,匹配成功后才执行{command},且/pattern/可缺省。
- END{command} -- 执行程序结束时执行的代码。可缺省。
5.awk脚本常规模式
5.1 正则表模式
正则匹配以字符串root开头的行,输出第1个字段。
awk '/^root/ {print $1}' /etc/passwd
5.2 比较模式
匹配第3个字段的值大于400的行,输出第1和第3字段。
awk '$3>400 {print $1 $3}' /etc/passwd
正则匹配第7个字段以bash结尾,输出第1和第7字段。
awk -F':' '$7~"bash$" {print $1 $7}' /etc/passwd
5.3 运算模式
awk -F':' '{print $1+1,$2+1}' file
5.4 范围模式
awk -F':' '/root/,/sys/ {print $1 $3}' file
5.5 特殊模式
BEGIN/END 仅在awk执行后或者结束前执行。
6.控制语句
6.1 if-else
#单分支
'{if (判断条件) {执行语句}}'
'{if (判断条件) 执行语句}'
#双分支
'{if (判断条件) {执行语句} else {执行语句}}'
'{if (判断条件) 执行语句;else 执行语句}'
#多分支
'{if (判断条件) {执行语句} else if (判断条件) {执行语句} else {执行语句}}'
'{if (判断条件) 执行语句;else if (判断条件) 执行语句;else 执行语句}'
判断/etc/passwd中用户名是root的则输出"root,admin"。其他则正常输出用户名。
awk -F':' '{if ($1=="root") {print $1,"admin"} else {print $1}}' /etc/passwd
6.2 while
i=0;while (判断条件i<2) {执行语句;i++}
awk -F':' '{i=0;while(i<2){print $1;i++}}' /etc/passwd
6.3 for
for (变量 in 数组) {执行语句}
for (变量;条件;表达式) {执行语句}
统计/etc/passwd中各解析器的用户数
awk -F: 'status[$NF]++ END{for (A in status) {print A, status[A]}}' /etc/passwd
示例记录
统计netstat各tcp链接状态数量
netstat -tan | awk '/^tcp/{status[$NF]++} END{for (A in status) {print A,status[A]}}'
分割后取倒数X列
#取倒数第4列
awk -F',' '{print $(NF-3)}'