awk
cat install.log | awk '/^Installing/ {print $0}'
匹配以Install打头的行,$0所有列,$1第1列,依次类推
cat /etc/passwd |awk -F ':' 'BEGIN {print "name,shell"} {print $1","$7} END {print "test,/bin/sh"}'
name,shell
root,/bin/bash
daemon,/bin/sh
bin,/bin/sh
sys,/bin/sh
....
test,/bin/sh
以:为分隔符,并在最前面输出name,shell,最后输出test,/bin/sh
awk 'NR%2==1{print $0}' /etc/passwd
隔行打印
awk 'END{print $0}'
打印最后一行
awk 'NR==5{print $0}'
打印第5行,NR已读的记录行数
awk '{$1="";print}'
打印非第1列
awk '{a[$NF]++}END{for(i in a)print i,":",a[i]}' test.log |sort -k 2 -r |head -3
打印出日志中,出现频率前3的行,以及出现的次数。NF浏览记录的域,此处将每次读取到的域作为key保存并累计+1,-k指定以哪个区间排序(默认升序,小的在前面),-r倒序,此处是以第2区间,因为for…in 输出,因为数组是关联数组,默认是无序的。所以通过for…in 得到是无序的数组。如果需要得到有序数组,需要通过下标获得。
awk '{a[$NF]++}END{for(i=1;i<=asort(a);i++)print a[i]}' test.log
打印有序数组
[root@localhost ~]# echo "a b c 2015-09-18 1:2" | awk 'sub(/-/,"")'
a b c 201509-18 1:2
替换
[root@localhost ~]# echo "a b c 2015-09-18 1:2" | awk 'gsub(/-/,"")'
a b c 20150918 1:2
全部替换
[root@localhost ~]# cat 1.txt
1 #1
2 #2
3 #3
4 #4
5 #5
6 #6
7 #7
8 #8
19 #19
[root@localhost ~]# cat 1.txt | awk '/^1/{sub(/#/,"*");print}'
1 *1
19 *19
匹配以1打头的行并替换#为*号再将其打印出
*
匹配前面的子表达式任意次。*等价于{0,}。如<a*匹配<也匹配<a
+
匹配前面的子表达式一次或多次(大于等于1次)。+等价于{1,}。
|
将两个匹配条件进行逻辑“或”(Or)运算。例如正则表达式(him|her) 匹配"it belongs to him"和"it belongs to her",但是不能匹配"it belongs to them."。注意:这个元字符不是所有的软件都支持的。
[root@localhost ~]# echo '123456' |awk 'BEGIN{FS=""}END{for(i=NF;i>=1;i--)a+=$i;print a}'
21
[root@localhost ~]# echo "123456789" |awk -F "" '{for(i=1;i<=NF;i++){s+=$i}}END{print s}'
45
求和
[root@localhost ~]# echo '123456' |awk 'BEGIN{FS=""}END{for(i=NF;i>=1;i--)a=a$i;print a}'
654321
改变顺序