awk的用法

2019-11-21  本文已影响0人  汪汪80

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

上一篇 下一篇

猜你喜欢

热点阅读