我们在面试中经常被问到的Linux命令 就都会包括awk命令的使用,下面我向大家总结awk命令的详细使用。希望能给大家一些帮助。
在国内很多大型公司面试后台程序员的时候无一例外都会问到下面这个题目
“请统计某个apache或者nginx 内的log文件,并求出里面IP数的top10”
当然,这个问题不仅仅可以用awk来回答,当然可以用基本的grep这个命令来回答。
我先给出这个题目最基本的解决答案:
假设这个就是apache 的access_log 文件(由于这个只是单机的apache 所以所有记录都是127.0.0.1,但是不妨碍学习这个问题的答案)
awk '{if($1~/^[0-9]+\.+[0-9]+\.+[0-9]+\.+[0-9]$/)print $1}' access_log | sort | uniq -c | head -n 10
截图如下
这样就能够求出ip数的top10了
接下来我们好好学习 awk 这个命令的使用规范:
盗用网上的资料 如下所示
比如有这个文件awk.txt 里面内容如下:
2 this is a test
3 Are you like awk
This's a test
3 Are you like awk
This's a test
10 There are orange,apple,mongo
对照这个文件我们一起学习 awk 这个命令的使用:
至此,大家肯定对awk这个命令多少有些了解了吧 。其实最后匹配ip的正则并不是最正确的。因为每个ip段都是小于255的。所以要是严格匹配的话 就非常的复杂了。大家可以看这边博客的介绍,就详细介绍了正则匹配ip地址的方法
http://blog.csdn.net/q472599451/article/details/8237535
希望大家喜欢我这次博客内容,谢谢!
另注:
对照这个文件我们一起学习 awk 这个命令的使用:
example 1
awk
'{print $1,$4}
' awk.txt =>>> 输出每行第一个跟第四个(根据空格根tab键隔开)
结果如下:
结果如下:
a a
3 like
This’s
10 orange
example 2
awk
'{printf
"%-8s %-8s\n
",$1,$2}
' awk.txt =>> 格式化输出第1,2 项
结果如下:
![](https://img-blog.csdn.net/20160317001004529?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
结果如下:
example 3
awk -Fh
'{print $1,$4}
' awk.txt =>>> 对第一行到第四行进行用h字符分割
结果如下:
![](https://img-blog.csdn.net/20160317001209092?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
结果如下:
example 4
awk -v a=1 -v b=2 '{print $1,$1+a,$1+b}' awk.txt =>>>设置a,b两个变量,但是注意 在print 中 无法使用 $a $b这样的变量 只能对结果进行变量替换
结果如下:
![](https://img-blog.csdn.net/20160317001325893?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
结果如下:
example 5
awk
'$1>2 {print $1,$2,$4}
' awk.txt
awk
'$1==2 {print $1,$2,$4}
' awk.txt =>>>在pattern前可以加上c语言判断
结果如下:
![](https://img-blog.csdn.net/20160317001509645?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
结果如下:
example 6
<、<=、==、!=、>=、~匹配正则表达式、!~不匹配正则表达式
http://blog.csdn.net/q472599451/article/details/8237535
希望大家喜欢我这次博客内容,谢谢!
另注:
linux 下匹配数字 :
或
echo 123abc | grep "^[[:digit:]]"