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