1.awk语法
awk 'pattern {action}' file
awk:指令名称
pattern:过滤器
action:动作
2.pattern
pattern是过滤器,在逐行处理的过程中,可以使用过滤器过滤掉不需要的行,或者过滤出需要的行。而过滤器可以有以下几种方式:
2.1.正则表达式
使用正则表达式来过滤,将要过滤的内容放在 / /中。
比如,过滤包含hello行:
awk '/hello/{print}' file
2.2.普通表达式
==(相等)、~(包含)、!~(不包含)、&&(且)、||(或)
示例:
test.txt内容如下:
hello world
hello wanglin
meituan
过滤第一个字段等于“hello”的行
awk '$1 == "hello"{print}' test.txt
hello world
hello wanglin
过滤出第一个字段包含“hello”的行
awk '$1 ~ "hello"{print}' test.txt
hello world
hello wanglin
过滤出第一个字段不包含“hello”的行
awk '$1 !~ "hello"{print}' test.txt
meituan
过滤出包含“hello”且包含“world”的行
awk '/hello/ && /world/{print}' test.txt
hello world
过滤出包含“hello”或者包含“meituan”的行
awk '/hello/ || /meituan/{print}' test.txt
hello world
hello wanglin
meituan
2.3.范围表达式
由两个pattern组成,begpat和endpat,中间使用逗号(,)分割,begpat表示匹配的开始位置,endpat表示匹配的结束位置
示例
test1.txt内容如下:
hello
meituan
alibaba
baidu
hello
baidu
alibaba
jd
hello
过滤出第一个字段是“hello” 到 “baidu”的行
awk '$1 == "hello",$1 == "baidu"{print}' test1.txt
hello
meituan
alibaba
baidu
hello
baidu
hello
2.4.BEGIN/END表达式
使用语法是 awk 'BEGIN{}{}END{action}',指定 initialization 和 cleanup 规则。
示例
test2.txt内容如下:
1
2
4
23
2
9
12
求最大值
awk 'BEGIN{max=0}{max=($1>max?$1:max)}END{print "max = "max}' test2.txt
max = 23
2.5.BEGINFILE/ENDFILE表达式
类似2.4,只不过是规则更复杂
2.6.空表达式
匹配所有行,不过滤任何内容
test.txt内容如下:
hello world
hello wanglin
meituan
打印test.txt的内容
awk '{print}' test.txt
hello world
hello wanglin
meituan
3.内置变量
FS:分隔符,默认空格
NR:当前行
NF:当前记录字段个数
$0:当前记录
$0 ~ n:当前记录中的第n个字段
示例
test3.txt内容:
hello,world,meituan,baidu,jd
hello,world,meituan,baidu,didi
hello,world,meituan,baidu,dada
hello,world,meituan,baidu,alibaba
打印每行每个字段用#连接起来
awk -F "," '{print $1"#"$2"#"$3"#"$4"#"$5}' test3.txt
hello#world#meituan#baidu#jd
hello#world#meituan#baidu#didi
hello#world#meituan#baidu#dada
hello#world#meituan#baidu#alibaba
打印第2 ~ 第5行的内容
awk 'NR == 2, NR == 5{print}' test3.txt
hello,world,meituan,baidu,didi
hello,world,meituan,baidu,dada
hello,world,meituan,baidu,alibaba
打印第2 ~ 第5行的内容最后一个字段
awk -F "," 'NR == 2, NR == 5{print $NF}' test3.txt
didi
dada
alibaba
4.内置函数
gsub(s,r): 在$0中,使用r代替s
index(s,t): 返回s中t的第一个位置
length(s) :s的长度
match(s,r) :s是否匹配r
substr(s,p) :返回s中从p开始的子串
5.参考
https://www.gnu.org/software/gawk/manual/html_node/Patterns-and-Actions.html#Patterns-and-Actions
网友评论