Linux高级命令-awk命令补充

Posted 熊老二-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux高级命令-awk命令补充相关的知识,希望对你有一定的参考价值。

段之间的连接符OFS
OFS用来指定输出记录分隔符
案例1::打印1,2,3段,指定#为连接符

awk '{OFS="#"}{print $1,$2,$3}' test_awk.txt

指定分隔符
-F 来指定分隔符
准备工作,现在有个文件test_awk2.txt,内容如下:

aaa:111:333
bbb:444:555
ccc:666:777:888
ddd:999:222:999:cccc

案例1: 打印出test_awk2.txt的第1段

awk -F ':' '{print $1}' test_awk2.txt

案例2: 打印出test_awk2.txt的所有段

awk -F ':' '{print $0}' test_awk2.txt

案例3: 打印出test_awk2.txt的第1,3段

awk -F ':' '{print $1,$3}' test_awk2.txt

内容匹配
这里的内容匹配需要使用正则表达式,常用的正则表达式规则如下:
  1、^linux 以linux开头的行
  2、$php 以php结尾的行
  3、. 匹配任意单字符
  4、.+ 匹配任意多个字符
  5、 .* 匹配0个或多个字符(可有可无)
  6、 [0-9a-z] 匹配中括号内任意一个字符
  7、 (linux)+ 出现多次Linux单词
  8、 (web){2} web出现两次以上
  9、\\ 屏蔽转义
实例:
案例1: 匹配test_awk2.txt中包含cc的内容

awk '/cc/'  test_awk2.txt

案例2: 匹配test_awk2.txt中第1段包含cc的内容

awk -F ':' '$1 ~ /cc/'  test_awk2.txt

案例3: 匹配test_awk2.txt中第1段包含至少连续两个c的内容

awk -F ':' '$1 ~ /cc+/'  test_awk2.txt

案例4: 在test_awk2.txt中如果匹配到aaa就打印第1,3段,如果匹配到ccc,就打印第1,3,4段

awk -F ':' '/aaa/ {print $1,$3} /ccc/ {print $1,$3,$4}'  test_awk2.txt

案例5: 在test_awk2.txt中如果匹配到aaa或者ddd,就打印全部内容

awk -F ':' '/aaa|ddd/ {print $0}' test_awk2.txt

段内容判断
在awk命令中,支持很多运算符,使用这些运算符可以进行段内容判断


案例1:在test_awk2.txt中如果第3段等于222就打印所有内容

awk -F ':' '$3==222 {print $0}' test_awk2.txt

案例2:在test_awk2.txt中如果第3段等于333就打印第一段

awk -F ':' '$3==333 {print $1}'  test_awk2.txt

案例3:在test_awk2.txt中如果第5段不等于cccc就打印全部

awk -F ':' '$5!="cccc" {print $0}' test_awk2.txt

案例4:在test_awk2.txt中如果第1段等于ccc,并且第2段大于300就打印全部

awk -F ':' '$1=="ccc" && $2>300 {print $0}' test_awk2.txt

案例5:在test_awk2.txt中如果第1段等于ccc,并且第2段匹配666就打印全部

awk -F ':' '$1=="ccc" && $2==666 {print $0}' test_awk2.txt

段之间的比较
案例1:在test_awk2.txt中如果第3段小于第4段就打印全部

 awk -F ':' '$3<$4 {print $0}' test_awk2.txt 

案例2:在test_awk2.txt中如果第2段等于第4段就打印全部

awk -F ':' '$2==$4 {print $0}' test_awk2.txt

NR行号和NF段数

案例1:打印test_awk2.txt全部内容显示行号

awk -F ':' '{print NR " : " $0}' test_awk2.txt 

案例2:打印test_awk2.txt全部内容显示段数

awk -F ':' '{print NF " : " $0}' test_awk2.txt 

案例3: 从test_awk2.txt的前3行中匹配出第2段等于 666,并显示行号

awk -F ':' 'NR<=3 && $2==666 {print $0}' test_awk2.txt

分段求和
awk 中还可以指定脚本命令的运行时机。默认情况下,awk 会从输入中读取一行文本,然后针对该行的数据执行程序脚本,但有时可能需要在处理数据前运行一些脚本命令,这就需要使用 BEGIN 关键字。BEGIN 会强制 awk 在读取数据前执行该关键字后指定的脚本命令。

案例1: 对test_awk2.txt中的第2段求和

awk -F ':' 'BEGING{total=0}{total=total+$2}END{print total}' test_awk2.txt 

综合案例
案例1: 统计当前目录下所有文本文件的大小
$5 为ll命令结果的第五列,该列刚好是显示文件的大小

ll | awk 'BEGIN{total=0}{total=total+$5} END{print(total)}'

案例2:求总成绩

awk的代码还可以放在一个脚本中,脚本的后缀是.awk,执行脚本的语法: awk -f 脚本名 源文件

需求:
有个文件score.txt,记录每个学生的成绩,要计算学生总成绩和每科平均成绩,文件内容如下:

(名字, 学号,数学成绩,英语成绩、计算机成绩)
Marry    2143 78 84 77
Jack     2321 66 78 45
Tom     2122 48 77 71
Mike     2537 87 97 95
Bob      2415 40 57 62

代码:
cal.awk

#!/bin/awk -f
#运行前
BEGIN {
    math = 0
    english = 0
    computer = 0
    printf "NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL\\n"
    printf "---------------------------------------------\\n"
}
#运行中
{
    math+=$3
    english+=$4
    computer+=$5
    printf "%-6s %-6s %4d %8d %8d %8d\\n", $1, $2, $3,$4,$5, $3+$4+$5
}
#运行后
END {
    printf "---------------------------------------------\\n"
    printf "  TOTAL:%8d %8d %8d \\n", math, english, computer
    printf "AVERAGE:%8.2f %8.2f %8.2f\\n", math/NR, english/NR, computer/NR
}

执行脚本并查看结果:

[root@node1 shell]# awk -f cal.awk score.txt 
NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL
---------------------------------------------
Marry  2143     78       84       77      239
Jack   2321     66       78       45      189
Tom    2122     48       77       71      196
Mike   2537     87       97       95      279
Bob    2415     40       57       62      159
---------------------------------------------
TOTAL:       319      393      350 
AVERAGE:     63.80    78.60    70.00

以上是关于Linux高级命令-awk命令补充的主要内容,如果未能解决你的问题,请参考以下文章

Linux高级命令-awk命令补充

Linux三剑客awk命令篇二:命令操作符

linux 高级命令--awk &管道命令 &sort & head & uniq

awk命令详解

一篇速学企业linux awk命令详解与应用(上篇)

一篇速学企业linux awk命令详解与应用(上篇)