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行的行号,第一字段和第三字段