目录
AWK介绍
基础语法
1.awk命令格式
2.选项参数
3.内建变量
4.awk脚本命令
5.awk脚本常规模式
5.1 正则表模式
5.2 比较模式
5.3 运算模式
5.4 范围模式
5.5 特殊模式
6.控制语句
6.1 if-else
6.2 while
6.3 for
示例记录
统计netstat各tcp链接状态数量
Linux中的AWS主要用于处理文本文件,标准化输出文本文件。Linux中默认自带的是gawk,兼容awk、nawk。
awk [选项参数] 'awk脚本命令' 文件
选项参数 | 说明 |
---|---|
-F [fs] | 指定分隔符,fs可以是一个字符串或者正则表达式。不指定fs默认用空格分隔。 |
-v var=value | 自定义变量。例:awk -v a=111 '{print $1,$2,a}' |
-f filename | 从文件中读取awk脚本。 |
-o --pretty-print |
将awk脚本输出到指定文件,如果不指定则输出到当前目录的awkprof.out文件。 |
变量 | 说明 |
---|---|
$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 | 如果是真,则忽略大小写匹配。 |
awk脚本命令主要分为三段:BEGIN{command}、/pattern/ {command} 、END{command}
awk 'BEGIN{command} /pattern/ {command} END{command}' file
正则匹配以字符串root开头的行,输出第1个字段。
awk '/^root/ {print $1}' /etc/passwd
匹配第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
awk -F':' '{print $1+1,$2+1}' file
awk -F':' '/root/,/sys/ {print $1 $3}' file
BEGIN/END 仅在awk执行后或者结束前执行。
#单分支
'{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
i=0;while (判断条件i<2) {执行语句;i++}
awk -F':' '{i=0;while(i<2){print $1;i++}}' /etc/passwd
for (变量 in 数组) {执行语句}
for (变量;条件;表达式) {执行语句}
统计/etc/passwd中各解析器的用户数
awk -F: 'status[$NF]++ END{for (A in status) {print A, status[A]}}' /etc/passwd
netstat -tan | awk '/^tcp/{status[$NF]++} END{for (A in status) {print A,status[A]}}'