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

--------EOF---------
微信分享/微信扫码阅读