awk: 行处理器

awk '/pattern/{command}' file1 file2 ..

print(输出 打印)
printf(格式化输出)
%c : 字符
%s : 字符串
%d : 整数
%f : float 浮点型 小数
%10s : 右对齐 10位宽度字符串
%-10s : 左对齐

Record : 记录 / 每一行
Field : 域

NR : record number : 行号
NF : field nunber : 字段的号 列号
FS : field separator : 分隔符
默认的分隔符是空格 " "
~ 匹配,与==相比不是精确比较
!~ 不匹配,不精确比较
== 等于,必须全部相等,精确比较
!= 不等于,精确比较
&&  逻辑与
|| 逻辑或

  • 匹配时表示1个或1个以上
    /[0-9][0-9]+/ 两个或两个以上数字
    /[0-9][0-9]*/ 一个或一个以上数字
    FILENAME 文件名
    OFS 输出字段分隔符, 默认也是空格,可以改为制表符等
    ORS 输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕
    -F'[:#/]' 定义三个分隔符

-F : 指定分隔符
awk -F: '{print $0}' /etc/passwd
//指定分隔符为:,打印整行
awk '{print $0}' awk.txt
//打印整行
awk '{print $1,$3}' awk.txt
//打印第一个字段和第三个字段
awk '{print $NF}' awk.txt
//打印最后一个字段
awk '{print NR,$0}' awk.txt
//打印行号及整行内容
this is a text
$1 $2 $3 $4 $0: 整行

awk -F: '{printf "%-20s%-5d\n",$1,$3}' /etc/passwd
//指定分隔符为:,格式化输出第一,三字段(第一字段为左对齐20个字符串的宽度,第三个字段为左对齐的5个宽度的整数)
awk '{print FNR,$0}' awk.txt awk2.txt
//以文件内容为界限,打印行号及整行内容
awk 'BEGIN{FS=":"}{print "Username: ",$1 }END{print "++++++++++++++++++++++++++++"}' /etc/passwd
//标准格式
awk 'BEGIN{X=0}/^$/{X+=1}END{print "I find",X,"blank lines."}' awk2.txt
//BEGIN预处理定义变量X值为0,每有一个/^$/(空白行),X值加1
awk 'NR==2,NR==6{print NR,$0}' awk2.txt
//打印2到6行的行号及整行内容
awk 'NF==4 {print $0}' awk2.txt
//找出整行内容有且仅有4个字段的行,打印输出
awk '{if(NF==4)print $0}' awk2.txt
//同上

awk -F: '$1~/nginx|root/' /etc/passwd
//打印第一字段是nginx和root的行

awk -F: '/gdm/,/tcpdump/{print NR,$1,$3}' /etc/passwd
//以:为分隔符,打印从gdm到tcpdump行的行号,第一字段和第三字段