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命令补充的主要内容,如果未能解决你的问题,请参考以下文章