Awk是一个实用程序,它使程序员能够以语句的形式编写眇小但有效的程序,这些语句定义要在文档的每一行中搜索的文本模式以及在一个文档中找到匹配时要采纳的操作。线。Awk紧张用于模式扫描和处理。它搜索一个或多个文件以查看它们是否包含与指定模式匹配的行,然后实行干系操作。
用途:
(a)转换数据文件
(b)天生格式化报告
(c)格式输出行
(d)算术和字符串操作
(e)条件和循环
还不知道awk是什么,没紧要,3分钟教会利用。
二、 用法2.1 用法
awk option 'pattern{action}' input_filename > output_filename
把稳: 'pattern{action}' 是利用单引号,而不是双引号。
2.2 事情流程:
(a)逐行扫描文件
(b)将每个输入行拆分为字段
(c)将输入行/字段比较为模式
(d)在匹配的行上实行操作
2.2 选项
-F 指定列分隔符-f 指定'pattern{action}'部分所在的文件-v var_name = var_value设置变量:
变量:
NR 保存当前行数NF 保存当前行中列的数量,如果是空行NF的值为0FS 保存列分隔符,用来每行分隔列利用。默认为white space(空缺符,包括空格或者tab)。可以重新分配。建议在BEGIN中重新设置。 BEGIN { FS = \"大众,\"大众} 重新设置成逗号。可以利用 -F \"大众,\"大众 选项指定。RS 保存当前行的分隔符,默认为\n.ORS 设置输出时每行结束分隔符,也便是行与行之前的分隔符。默认为\n。 一样平常在BEGIN中设置。OFS 设置输出时每行字段之间的分隔符,默认 blank space(空格)。一样平常在BEGIN中设置。FIELDWIDTHS指定每隔字段的宽度(字段字符个数),例如 'BEGIN {FIELDWIDTHS = \"大众3,4\"大众} print $2,$3' , 代表$2字符长度最长为3,$3最长字符为4$0代表一整行的数据$n代表每一行的n列数据,例如$1 代表第一列,$2代表第二列
分外代码块
BEGIN { #code } : BEGIN 关键字后面的紧跟的第一个代码块({#code}),只会在第一行数据输入之前实行一次END { #code} : END 关键字后面的紧跟的第一个代码块({#code}),只会在末了一行数据实行完往后实行一次pattern { #code1} {#code2} : pattern返回结果为true时,实行code1,范围false时,不实行code1。但是code2都会实行。每行数据实行一次。{print $1,$2,$3} : 打印字段1,字段2,字段3。字段之前利用逗号分隔,输出的时候逗号会被更换成OFS变量的值next : 实行到next时,当前行不知实行next之后的代码(不管后面是什么都会实行),直接实行下一行输入
还不知道awk是什么,没紧要,3分钟教会利用。
三、 案例
如果我们有一个文件score.txt,内容如下(姓名 科目 分数):
[root@dongjing awk]# cat score.txtTom Scala 30Tom Scala 30Tom Java 30aJack Python 95bJack Python 95Jack Spring 95Mike Java 95Linda Linux 85Linda PHP 66Linda Linux 85XY PHP 100XY Java 55Mike Scala 9SS Shell 99
3.1 添加行号
[root@dongjing awk]# awk '{print NR,$0}' score.txt1 Tom Scala 302 Tom Scala 303 Tom Java 304 aJack Python 955 bJack Python 956 Jack Spring 957 Mike Java 958 Linda Linux 859 Linda PHP 6610 Linda Linux 8511 XY PHP 10012 XY Java 551314 Mike Scala 915 SS Shell 99[root@dongjing sort]# cat -n score.txt 1 Tom Scala 30 2 Tom Scala 30 3 Tom Java 30 4 aJack Python 95 5 bJack Python 95 6 Jack Spring 95 7 Mike Java 95 8 Linda Linux 85 9 Linda PHP 66 10 Linda Linux 85 11 XY PHP 100 12 XY Java 55 13 14 Mike Scala 9 15 SS Shell 99
3.2 过滤含有指天命据的行
awk 'patter' filename或者awk 'patter { print }' filename
a. 指定包含Java的行
# 利用awk[root@dongjing awk]# awk '/Java/' score.txtTom Java 30Mike Java 95XY Java 55[root@dongjing awk]# awk '/Java/ { print }' score.txtTom Java 30Mike Java 95XY Java 55# 利用 grep[root@dongjing awk]# grep Java score.txtTom Java 30Mike Java 95XY Java 55[root@dongjing awk]# grep \"大众Java\"大众 score.txtTom Java 30Mike Java 95XY Java 55
3.3 获取指定的行或者指定例模的行
a. 显示score.txt文件中的3-6行
[root@dongjing awk]# awk 'NR == 3 , NR == 6 { print NR,$0 }' score.txt3 Tom Java 304 aJack Python 955 bJack Python 956 Jack Spring 95[root@dongjing awk]# awk '(NR >= 3) && ( NR <= 6) {print NR,$0}' score.txt3 Tom Java 304 aJack Python 955 bJack Python 956 Jack Spring 95
3.4 数据求和
a. 求score文件中所有科目分数之和(不能包含重复项)
[root@dongjing awk]# sort -u score.txt | awk 'NF > 0' | awk '{sum += $3 } END {print \"大众Total Score: \"大众 sum }'Total Score: 854# bc命令默认不安装,如果还没有安装请利用: yum install -y bc 安装即可[root@dongjing awk]# sort -u score.txt | awk 'NF > 0'| awk ' $3 > 0 {ORS = \公众+\公众} {print $3}' | sed 's/\+$/\n/g'| bc854
3.5 打印非空行或者打印空行
a. 打印score.txt中的空行
[root@dongjing awk]# awk 'NF == 0 { print NR,$0 }' score.txt13[root@dongjing awk]# awk '/^$/ { print NR,$0 }' score.txt13# 打印空行或者全是空缺符的行[root@dongjing awk]# awk '/^\s$/ { print NR,$0}' score.txt13
b. 打印score.txt中的非空行
# 把稳这里没有13行,由于13行是空行[root@dongjing awk]# awk 'NF > 0 { print NR,$0 }' score.txt1 Tom Scala 302 Tom Scala 303 Tom Java 304 aJack Python 955 bJack Python 956 Jack Spring 957 Mike Java 958 Linda Linux 859 Linda PHP 6610 Linda Linux 8511 XY PHP 10012 XY Java 5514 Mike Scala 915 SS Shell 99[root@dongjing awk]# awk 'length($0) > 0 {print NR,$0} ' score.txt1 Tom Scala 302 Tom Scala 303 Tom Java 304 aJack Python 955 bJack Python 956 Jack Spring 957 Mike Java 958 Linda Linux 859 Linda PHP 6610 Linda Linux 8511 XY PHP 10012 XY Java 5514 Mike Scala 915 SS Shell 99
3.6 查找文件中最长行的字符数
打印score.txt文件中最长行的字符数
[root@dongjing awk]# awk '{if(length($0) > max) max = length($0)} END { print max}' score.txt15[root@dongjing awk]# wc -L score.txt15 score.txt
3.7 打印指定列知足条件的数据
打印score.txt第二列为Python学生姓名和成绩
[root@dongjing awk]# awk '{if($2 ~ /Python/) print NR,$1,$3 }' score.txt4 aJack 955 bJack 95[root@dongjing awk]# awk '{if($2 == \"大众Python\"大众) print NR,$1,$3 }' score.txt4 aJack 955 bJack 95
3.8 打印超过指定个数字符的行
打印score.txt文件中大于12个字符的行
# 查看每行字符数量[root@dongjing awk]# awk '{ print NR,length($0),$0}' score.txt1 12 Tom Scala 302 12 Tom Scala 303 11 Tom Java 304 15 aJack Python 955 15 bJack Python 956 14 Jack Spring 957 12 Mike Java 958 14 Linda Linux 859 12 Linda PHP 6610 14 Linda Linux 8511 10 XY PHP 10012 10 XY Java 5513 014 12 Mike Scala 915 11 SS Shell 99# 查看大于12个字符的行[root@dongjing awk]# awk 'length($0) > 12 { print NR,length($0),$0}' score.txt4 15 aJack Python 955 15 bJack Python 956 14 Jack Spring 958 14 Linda Linux 8510 14 Linda Linux 85
3.9 循环
a. 打印1-6平方的数据
[root@dongjing awk]# awk 'BEGIN { for(i=1;i<=6;i++) print i,\"大众\公众,i,\公众=\"大众,ii;}'1 1 = 12 2 = 43 3 = 94 4 = 165 5 = 256 6 = 36[root@dongjing awk]# awk 'BEGIN { for(i=1;i<=6;i++){ print i,\"大众\"大众,i,\公众=\公众,ii;}}'1 1 = 12 2 = 43 3 = 94 4 = 165 5 = 256 6 = 36
3.10 打印文件总行数
[root@dongjing awk]# cat score.txt | wc -l15[root@dongjing awk]# awk 'END { print NR}' score.txt15[root@dongjing awk]# awk '{lines += 1} END { print lines }' score.txt15
3.11 如何判断到达末了一行
在score.txt 末了一行添加 the end
[root@dongjing awk]# awk 'FNR == NR {last++;next}{print FNR, $0, ((last == FNR) ? \公众the end\"大众:\公众\"大众) }' score.txt score.txt1 Tom Scala 302 Tom Scala 303 Tom Java 304 aJack Python 955 bJack Python 956 Jack Spring 957 Mike Java 958 Linda Linux 859 Linda PHP 6610 Linda Linux 8511 XY PHP 10012 XY Java 5513 14 Mike Scala 915 SS Shell 99 the end
代码解释:
1. next : 如果实行next那么本行将不会实行next往后的代码,直接进入下一行打算。
2,. awk中一个匹配如果成立(结果为true或者1),那么会指定后面紧跟(最近)的代码块({}之间的内容),其他的代码块跟匹配条件没有关系。例如: 'FNR == NR {last++;next}{print FNR, $0, ((last == FNR) ? \"大众the end\"大众:\"大众\公众) }' ,如果 FNR == NR 成立,则会实行{last++;next} 代码块,否则{last++;next} 不会实行。{print FNR, $0, ((last == FNR) ? \"大众the end\"大众:\公众\公众) } 代码块每次都会实行。
3.12 修正分隔符
a. 将score.txt文件中所有行的数据都即统一为一行,并且行之间利用:分隔
[root@dongjing awk]# awk '{ORS = \"大众:\公众}{print}' score.txt | sed 's/:$/\n/'Tom Scala 30:Tom Scala 30:Tom Java 30:aJack Python 95:bJack Python 95:Jack Spring 95:Mike Java 95:Linda Linux 85:Linda PHP 66:Linda Linux 85:XY PHP 100:XY Java 55::Mike Scala 9:SS Shell 99
b. 将score文件中每行列之间的分隔符都换成逗号
# 不生效[root@dongjing awk]# awk '{OFS = \"大众,\"大众}{print }' score.txtTom Scala 30Tom Scala 30Tom Java 30aJack Python 95bJack Python 95Jack Spring 95Mike Java 95Linda Linux 85Linda PHP 66Linda Linux 85XY PHP 100XY Java 55Mike Scala 9SS Shell 99# 不生效[root@dongjing awk]# awk '{OFS = \"大众,\"大众}{print $0}' score.txtTom Scala 30Tom Scala 30Tom Java 30aJack Python 95bJack Python 95Jack Spring 95Mike Java 95Linda Linux 85Linda PHP 66Linda Linux 85XY PHP 100XY Java 55Mike Scala 9SS Shell 99# 打印的时候须要指定每个字段[root@dongjing awk]# awk '{OFS = \公众,\公众}{print $1,$2,$3 }' score.txtTom,Scala,30Tom,Scala,30Tom,Java,30aJack,Python,95bJack,Python,95Jack,Spring,95Mike,Java,95Linda,Linux,85Linda,PHP,66Linda,Linux,85XY,PHP,100XY,Java,55,,Mike,Scala,9SS,Shell,99
3.找到没门学科等分数前两名的学生信息(相同分数排名依次向下)
# 排序去重 [root@dongjing awk]# sort -u score.txtaJack Python 95bJack Python 95Jack Spring 95Linda Linux 85Linda PHP 66Mike Java 95Mike Scala 9SS Shell 99Tom Java 30Tom Scala 30XY Java 55XY PHP 100# 去取空行[root@dongjing awk]# sort -u score.txt | awk 'NF > 0'aJack Python 95bJack Python 95Jack Spring 95Linda Linux 85Linda PHP 66Mike Java 95Mike Scala 9SS Shell 99Tom Java 30Tom Scala 30XY Java 55XY PHP 100# 按照学科和分数排序,学科是第一排序,分数是第二排序。相称于SQL: order by course, score desc[root@dongjing awk]# sort -u score.txt | awk 'NF > 0' | sort -k2,2 -k3,3grMike Java 95XY Java 55Tom Java 30Linda Linux 85XY PHP 100Linda PHP 66aJack Python 95bJack Python 95Tom Scala 30Mike Scala 9SS Shell 99Jack Spring 95# 对每一个学科取前两名。 相称于SQL中利用开窗函数[root@dongjing awk]# sort -u score.txt | awk 'NF > 0' | sort -k2,2 -k3,3gr | awk '((last == $2) || (last == \"大众\"大众))&&(limit < 2){limit++; print; } (last != $2 )&&(last != \"大众\"大众 ){limit = 1; print} {last = $2}'Mike Java 95XY Java 55Linda Linux 85XY PHP 100Linda PHP 66aJack Python 95bJack Python 95Tom Scala 30Mike Scala 9SS Shell 99Jack Spring 95