awk命令学习(二)
一、awk操作符
1、设置输入域到域变量名
awk '{name=$1;number=$3;if($1 ~/^g/) print name "has" employeer:" number} t.txt
输出:
gugehas employeer 300
googlehas employeer 5000
2、域值比较
awk -F: '{if($2>100) print $0}' t.txt
如果域2大于100,就打印该行
3、修改数值域
awk -F: '{if($2>100) $2=$2-1;print $0}' t.txt
guge:50:300
baidu:100:5000
sohu:100:4500
google 109 5000
4、修改文本域
awk -F: '{if($2>100) $1="baidu";print $0}' t.txt
5、创建新域
awk -F: '{if($2>100) $4=$3-$2;print $0}' t.txt
二、内置字符串函数
1、gsub(s,r) 用r代替s.
awk -F: 'gsub(/google/,"baidu") {print $0}' no_blan.txt
2、gsub(s,r,t)在整个t域中,用r代替s。这个可以指定域,是第一个加强版。
awk -F: 'gsub(/^g.*/,"baidu",$1) {print $0}' no_blan.txt
baidu 50 3000
baidu 110 5000
这个只会打印匹配的行。
3、sub(r,s)将最左边的r替换为s。 这个也只会打印匹配的行。
awk -F: '{$4=$3;print $0}' no_blan.txt | awk 'sub(/3000/,"4000")'
guge 50 4000 3000,只将第一次出现的3000变成4000.
4、substr(s,p,n)返回字符串s中,从位置p开始长度为n的后缀部分。
awk -F: '{print substr($1,1,10)}' no_blan.txt
如果指定长度超过了指定字符串长度,那么也就只打印整个字符串后缀了。 如果开始位置超过字符串长度,那么就打印空了。
5、substr(s,p),这个不指定字符串长度。
6、index(r,s)返回r中字符串s的第一次出现位置。
awk -F: '{print index($1,"o")}' no_blan.txt
如果没有就打印0。
7、length返回指定字符串长度。
8、match(r,s)测试r中是否包含匹配s的字符串。
awk -F: '{print match($1,/g/)}' no.txt
如果没有就返回0,如果有,就返回第一各匹配的位置字符数。
三、awk数组
awk数组要结合split函数。
awk '{print split($1,myar,":") } END{for (e in myar) print myar[e]}' no_blan.txt
四、awk特殊用法
1、向awk命令传值。awk 变量=输入值
awk -F: '{if($1==com) print $0}' com="google" no_b.txt
当然这里面也可以传入环境变量,即后面的com=$LOGNMAE,这里就是随便举一个环境变量的例子。
2、awk脚本
-
首行加上:
!/bin/awk -f
。和shell,python的首行作用类似,目的告诉解释器的位置。 -
awk脚本传入文件等参数。 awk -f script_file var=value input_file
例子:
命令:awk -f a.awk var="baidu" no_blan.txt
1、no_blan.txt内容(pg no_blan.txt): guge:50:3000 baidu:100:5000 sohu:100:4500 google:110:5000
2、脚本a.awk文件:
pg a.awk
!/bin/awk -f
BEGIN{print "Comp Emp NUM"}
{if($1==var) print $0}
五、快速用法
1、替换某个域。
awk -F: '{if($1~/^g/) $1="baidu";print $0}' no_blan.txt
微信分享/微信扫码阅读