基础用法
awk -F FS值 '处理行{处理规则}' 处理文本
awk可以用于处理多行的文本或者命令输出的内容,一般为先确定行再确定列。
-F指定列的分割符,FS为awk内置变量,存储分隔符(默认空格或Tab,可指定多个用中括号包裹),例如按"*"或"@"分割:
awk -F "[*@]" 'NR==1{print FS}' xxx.txt
输出:[*@]
NR表示处理行号(从1开始),如果不指定NR则作用于所有行。
awk通过$加数字来指定处理的列号(从1开始),但是$0表示全部列,也就等同于当前整个一行。
内置函数
以test.txt作为处理对象,内容如下:
1. sub/gsub 替换
用法:sub/gsub(/str1/,str2,col)
str1:要替换成的字符串(用两个正斜杠包裹)
str2:被替换的字符串
col:被处理的列(可省略代表处理当前行)
区别:sub之替换第一次出现的,gsub替换所有
例如替换test.txt文本第一行第一次出现/所有的双引号(")为星号(*):
awk 'NR==1{sub(/"/,"*");print $0} test.txt'
awk 'NR==1{gsub(/"/,"*");print $0}' test.txt
2. toupper/tolower 大/小写转换
用法:toupper/tolower(col)
col:被处理的列(不可省略)
例如把test.txt文本中第二行的"ApplE"按全大写、"baNaNa"按全小写输出:
awk ’NR==2{print toupper($1);print tolower($2)}‘ test.txt
3. length 获取长度
用法:length(col)
col:被处理的列(可省略代表处理当前行)
例如获取test.txt文本第三行第一列的字段的长度:
awk 'NR==3{print length($1)}' test.txt
4. substr 截取子串
用法:substr(col,startindex,len)
col:被处理的列(不可省略)
startindex:要截取子串的起始下标(从1开始)
len:要截取子串的长度(值为正整数才有效)
例如截取test.txt文本第三行第二列的字段,从该字段下标为5的位置开始截取4个字符长度
awk 'NR==3{print substr($2,5,4)}' test.txt
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
获取test.txt文本中第四行匹配正则表达式"ab[cd]"的下标位置以及RSTART和RLENGTH值
awk 'NR==4{print match($0,"ab[cd]")}' test.txt
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}'
例如获取机器上安装的java版本:
java -version 2>&1 | awk 'NR==1{gsub(/"/,""); print $3}'
最后注意点:
一、虽然可以通过$0作用当前行,但awk命令中涉及下标的都是从1开始
二、awk不会对处理文本的内容做修改
三、所有awk内置方法名均为小写
四、length、sub、gsub三个方法都可以省略最后一个参数,作用于当前行,相当于$0,比如length()的输出等同于length($0)