前言 awk
是Unix
的行处理命令, 以行 为单位, 依次读入文本的每行进行切片处理。
使用格式 1 awk [option] '[BEGIN{awk 操作命令}]pattern{awk 操作命令}[END{awk 操作命令}]' file(s)
BEGIN{awk 操作命令}
: 可选的, 前置操作, 在执行pattern
循环之前执行。END{awk 操作命令}
: 可选的, 后置操作, 在执行pattern
循环之后执行。pattern{awk 操作命令}
: 必选的, 对每行进行处理。awk 操作命令
: 包括函数调用printf()
, 控制指令if else
等。
切片处理 所谓的切片处理 , 举个例子就是a:b:c
, 可以将:
作为分隔符, 划分为3
个片段。
-F separator
选项: 指定separator
作为分隔符, 默认为空格$n
变量: $0
表示当前行的内容, $n
表示当前行内, 以上面的separator
分割的第n
个片段NR
变量: 每行的行号, The total number of input records seen so far.
NF
变量: 分割的片段的数量, The number of fields in the current input record.
FILENAME
变量: 正在处理的文件名
1 2 3 4 5 6 7 8 9 10 awk -F ':' '{print $3}' /tmp/passwd awk -F ':' '{print $1,$3}' /tmp/passwd awk -F ':' '{print $1" "$3}' /tmp/passwd awk -F ':' '{print "USER:"$1"\tUID:"$3}' /tmp/passwd awk -F ':' '{print NR"\t"NF"\tUSER:"$1"\tUID:"$3}' /tmp/passwd awk -F ':' '{print FILENAME"\tUSER:"$1"\tUID:"$3}' /tmp/passwd
pattern pattern
是每行前的一个匹配表达式。分为两种。
~
, !~
: 匹配正则表达式
==
, !=
, <
, >
: 判断逻辑表达式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 awk -F ':' '/root/{print NR"\t"$0}' /tmp/passwd awk -F ':' '$3~/^1.*/{print NR"\t"$3"\t"$1}' /tmp/passwd awk -F ':' '$3!~/^1.*/{print NR"\t"$3"\t"$1}' /tmp/passwd awk -F ':' '{if($3>100) print NR"\t"$3"\t"$1}' /tmp/passwd awk -F ':' '$3>100{print NR"\t"$3"\t"$1}' /tmp/passwd awk -F ':' '$3==0{print NR"\t"$3"\t"$1}' /tmp/passwd awk -F ':' '$3!=0{print NR"\t"$3"\t"$1}' /tmp/passwd
函数调用 1 2 3 awk -F ':' '{print NR"\t"$1}' /tmp/passwd awk -F ':' '{printf("%s\t%s\n", NR, $1)}' /tmp/passwd
逻辑计算 1 awk [option] '[BEGIN{awk 操作命令}]pattern{awk 操作命令}[END{awk 操作命令}]' file(s)
这里的BEGIN
和END
可以进行一些初始化操作和结尾操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 ll / | awk 'BEGIN{size=0}{size+=$5}END{print "size:"size/1024/1024"M"}' awk -F ':' 'BEGIN{count=0}$1!~/^$/{count++}END{print "count:"count}' /etc/passwd awk -F ':' 'BEGIN{print "NR\tUsername"}{if($3>100) print NR"\t"$1}END{print "-------"FILENAME"-------"}' /etc/passwd awk -F ':' 'BEGIN{count=0}{if($3>100)name[count++]=$1}END{for(i=0;i<count;i++) print i"\t"name[i]}' /etc/passwd netstat -anp | awk '$6~/(LISTEN)|(CONNECTED)/{sum[$6]++}END{for(i in sum) print i" : "sum[i]}'