1,简介
1) 从输入流读取一行(文件,管道或者标准输入),存储到内存中。
echo hzq 123 | awk '{print $0}'
awk '{print $0}' test.csv
grep line test.csv | awk 'print $0'
2)对每一行执行执行相应的命令,处理文本。(默认的域分隔符是空格和tab,可以使用-F指定单一的tab分隔符-F '\t')
域分隔符分开的每一项称为一个域。
3)对每一行,重复执行命令,直到结尾。
2,语法与概念
1)awk [-F field-separator] 'commands'
-F 指定域分隔符, 默认为空格或者tab
awk -F ':' '{print $1"\t"$2}' test.csv
指定 :作为域分隔符。
2)awk内置的变量
$0 : 整行记录
$1~$n : 表示第1~n个域
NF:域的个数
NR:已读的记录数awk '{print NR "\t" NF}' test.csv
FNR 当前记录数,是各个文件自己的行号
$NF 表示的最后一个Field(域)
FS 输入字段分隔符 默认是空格或Tab
RS 输入的记录分隔符, 默认为换行符
3,例子
1)netstat -anp | grep tcp | awk '{printf "%s %s %-8s %-8s %-8s %-22s %-22s %-15s %-15s\n",NR,FNR,$1,$2,$3,$4,$5,$6,$7}'
2)netstat -anp | grep tcp | awk '$6 == "LISTEN" || $6 == "ESTABLISHED" {print $7}'
3) awk -F ':' '{print $1, $6}' /etc/passwd
awk 'FS=":" {print $1, $6}' /etc/passwd
4)awk '$NF ~ /976/ {print $NF}' test.csv最后一个域匹配字符串976的
netstat -anp | grep tcp | awk '/ESTABLISHED/ && !/mysql/'