1. awk -F: '{print $1}' /tmp/passwd

2. awk -F: 'BEGIN{print "helloword"} {print $1,$3} END{print "bye"}' /tmp/passwd  

helloword

root 0

bin 1

daemon 2

bye


3. sub匹配第一次出现的符合模式的字符串,相当于 sed 's//'   。

gsub匹配所有的符合模式的字符串,相当于 sed 's//g' 

[root@qing ~]# awk -F: '{ gsub(/[0-9]/," ",$3);print $0 }' /tmp/passwd  

root x   0 root /root /bin/bash

bin x   1 bin /bin /sbin/nologin

daemon x   2 daemon /sbin /sbin/nologin

qing:qing:qing:liang


[root@qing ~]# awk -F: '{ sub(/[0-9]/," ");print $0 }' /tmp/passwd    

root:x: :0:root:/root:/bin/bash

bin:x: :1:bin:/bin:/sbin/nologin

daemon:x: :2:daemon:/sbin:/sbin/nologin

qing:qing:qing:liang


[root@qing ~]# awk -F: -v OFS='|' '{ sub(/[0-9]/," ",$3);print $0 }' /tmp/passwd  

root|x| |0|root|/root|/bin/bash

bin|x| |1|bin|/bin|/sbin/nologin

daemon|x| |2|daemon|/sbin|/sbin/nologin

qing:qing:qing:liang


sub函数匹配指定域/记录中最大、最靠左边的子字符串的正则表达式,并用替换字符串替换这些字符串。

如果没有指定目标字符串就默认使用整个记录。替换只发生在第一次匹配的时候。格式如下:

sub (regular expression, substitution string):

sub (regular expression, substitution string, target string)

实例:

$ awk '{ sub(/test/, "mytest"); print }' testfile

$ awk '{ sub(/test/, "mytest", $1); print }' testfile

      第一个例子在整个记录中匹配,替换只发生在第一次匹配发生的时候。

      第二个例子在整个记录的第一个域中进行匹配,替换只发生在第一次匹配发生的时候。

如要在整个文件中进行匹配需要用到gsub

gsub函数作用如sub,但它在整个文档中进行匹配。格式如下:

                  gsub (regular expression, substitution string)

                  gsub (regular expression, substitution string, target string)

实例:

$ awk '{ gsub(/test/, "mytest"); print }' testfile

$ awk '{ gsub(/test/, "mytest", $1); print }' testfile

      第一个例子在整个文档中匹配test,匹配的都被替换成mytest。

      第二个例子在整个文档的第一个域中匹配,所有匹配的都被替换成mytest。

另外, 只有当记录中的域有改变的时候 ,指定0FS变量才有用, 如果记录中的域无变化, 指定OFS产生不了实际效果。



awk -F'|' -v OFS='|' '{ gsub(/[0-9]/, "", $3); print $0; }' data.txt   



将把第三个域中所有数字都去掉




4. 去掉空格:echo 'a b  c'|awk '{gsub(/[[:blank:]]/, "");print}'

5. [root@qing ~]# awk -F: '$1 ~ /root/{print $1}' /tmp/passwd 

6. awk 'BEGIN{FS=":"}$1 ~ /[rR]oot/{print $1}' /tmp/passwd  同上

7. awk 'BEGIN{FS=":"}$1 ~ /[rR]oot/{if ($3>=0)print $1}' /tmp/passwd  

[root@qing ~]# awk 'BEGIN {count=0;print "[start]user count is ", count} {count=count+1;} END{print "[end]user count is ", count}' /etc/passwd         

[start]user count is  0

[end]user count is  34

[root@qing ~]# ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size}'

[end]size is  86884


8. 查看历史命令中次数最多的10个

[root@qing tmp]# cat hist_num.sh            

#!/bin/bash                                 

#filename for history                       

#you can use this to count the most command 

#by liang-ming 2015-10-19                   

                                            

printf "COMMAND\t\COUNT\n";                 

                                            

cat ~/.bash_history | awk '{ list[$1]++; } \

END{                                        

for(i in list)                              

{                                           

 printf("%s\t%d\n",i,list[i]); }            

}' | sort -nrk 2 | head                     

[root@qing tmp]# ./hist_num.sh              

COMMAND \COUNT                              

vim     155                                 

echo    125                                 

ll      120                                 

cd      111                                 

cat     88                                  

python  52                                  

awk     50                                  

ansible 38                                  

salt-ssh        29                          

curl    21