awk基础用法与内置函数小结

 

基础用法

 

awk -F FS值 '处理行{处理规则}' 处理文本 

awk可以用于处理多行的文本或者命令输出的内容,一般为先确定行再确定列。

-F指定列的分割符,FS为awk内置变量,存储分隔符(默认空格或Tab,可指定多个用中括号包裹),例如按"*"或"@"分割:

awk -F "[*@]" 'NR==1{print FS}' xxx.txt

输出:[*@]

NR表示处理行号(从1开始),如果不指定NR则作用于所有行。

awk通过$加数字来指定处理的列号(从1开始),但是$0表示全部列,也就等同于当前整个一行。 

 

内置函数

以test.txt作为处理对象,内容如下:

awk基础用法与内置函数小结

1. sub/gsub  替换

用法:sub/gsub(/str1/,str2,col)

str1:要替换成的字符串(用两个正斜杠包裹)

str2:被替换的字符串

col:被处理的列(可省略代表处理当前行)

区别:sub之替换第一次出现的,gsub替换所有

例如替换test.txt文本第一行第一次出现/所有的双引号(")为星号(*):

awk 'NR==1{sub(/"/,"*");print $0} test.txt'

awk基础用法与内置函数小结

awk 'NR==1{gsub(/"/,"*");print $0}' test.txt

awk基础用法与内置函数小结

2. toupper/tolower 大/小写转换

用法:toupper/tolower(col)

col:被处理的列(不可省略)

例如把test.txt文本中第二行的"ApplE"按全大写、"baNaNa"按全小写输出:

awk ’NR==2{print toupper($1);print tolower($2)}‘ test.txt

awk基础用法与内置函数小结

3. length 获取长度

用法:length(col)

col:被处理的列(可省略代表处理当前行)

例如获取test.txt文本第三行第一列的字段的长度:

awk 'NR==3{print length($1)}' test.txt

awk基础用法与内置函数小结

4. substr 截取子串

用法:substr(col,startindex,len)

col:被处理的列(不可省略)

startindex:要截取子串的起始下标(从1开始)

len:要截取子串的长度(值为正整数才有效)

例如截取test.txt文本第三行第二列的字段,从该字段下标为5的位置开始截取4个字符长度

awk 'NR==3{print substr($2,5,4)}' test.txt

awk基础用法与内置函数小结

5. index/match 获取位置(第一次出现)

用法:index/match(col,str) 

col:被处理的列(不可省略)

str:匹配的字符串/正则表达式

区别:index匹配的是字符串,match匹配的是正则表达式,此外针对match方法,awk还有两个内置变量RSTART、RLENGTH

RSTART:同index/match命令的返回值,正则表达式匹配的字符串在原列中第一次出现位置(下标从1开始,无匹配返回0)

RLENGTH:正则表达式匹配的字符串长度(无匹配返回-1)

例如获取test.txt文本中第四行匹配字符串"abc"的下标位置:

awk 'NR==4{print index($0,"abc")}' test.txt

awk基础用法与内置函数小结

获取test.txt文本中第四行匹配正则表达式"ab[cd]"的下标位置以及RSTART和RLENGTH值

awk 'NR==4{print match($0,"ab[cd]")}' test.txt

awk基础用法与内置函数小结

 

awk常用场景

(1)判断进程是否存在,若存在则杀死进程

例如查找nginx进程是否存在:

ps -ef | grep "nginx" | grep -v grep | awk 'NR==1{print $2}' | xargs kill -9 >/dev/null 2>&1

若能搜索到多个进程ID,去掉NR==1:

ps -ef | grep "nginx" | grep -v grep | awk '{print $2}' | xargs kill -9 >/dev/null 2>&1

(2)针对输出结果为多行的命令获取指定字段

例如获取当前机器可用内存(M):

free -m | awk 'NR==2{print $3}'

awk基础用法与内置函数小结

例如获取机器上安装的java版本:

java -version 2>&1 | awk 'NR==1{gsub(/"/,""); print $3}'

awk基础用法与内置函数小结 

 

最后注意点:

一、虽然可以通过$0作用当前行,但awk命令中涉及下标的都是从1开始

二、awk不会对处理文本的内容做修改

三、所有awk内置方法名均为小写

四、length、sub、gsub三个方法都可以省略最后一个参数,作用于当前行,相当于$0,比如length()的输出等同于length($0)

上一篇:09、shell三剑客值awk


下一篇:Linux 文本处理利器--Awk常用命令