Awk的一些技巧总结[不定期更新]


如何快速截取某段时间内的日志

在排除故障时,需要分析发生故障的原因,避免再次出现同样的问题,需要对日志进行分析,截取故障前后时间段的日志。之前是用正则表达式来获取某段时间的内的日志,需要单独编写/修改脚本。然后刚才看到ttlsa.com博客里面说的一种awk方法,实际测试可行:

这里以截取nginx访问日志为例:查看09/Aug/2014:00:01:12到09/Aug/2014:00:03:30时间段内ixyzero.com的访问日志。

# awk '$4 >="[09/Aug/2014:00:01:12" && $4 <="[09/Aug/2014:00:03:30"' access.log

之前我还真没想到awk竟然可以这么用来比较时间大小,学习了。

参考地址:http://www.ttlsa.com/linux/how-to-quickly-intercept-logs-over-time/


 

打印文件的第一列(域): awk ‘{print $1}’ filename
打印文件的前两列(域): awk ‘{print $1,$2}’ filename
打印文本文件的总行数: awk ‘END{print NR}’ filename #END必不可少,否则从1开始打印

如果想要把某一文件的总行数赋值给变量nlines,可以表达为:
1) nlines=`(awk ‘END{print NR}’ filename)`
或者
2) nlines=$(awk ‘END{print NR}’ filename)

让awk打印除第一列外的所有列怎么写?

方法一:
awk ‘{for(iCnt=2;iCnt<=NF;iCnt++)print $iCnt}’ urfile
方法二:
awk ‘{$1=””;print $0}’ filename

awk合并文件问题

我有2个文件 tmp1.txt 和 tmp2.txt
tmp1.txt
20
18
19

tmp2.txt
15
14
13

我想做个文件tmp3.txt做成
20 15
18 14
19 13
就是把tmp1.txt和tmp2.txt按列合并。

方法一:

使用paste命令:paste tmp1.txt tmp2.txt >tmp3.txt

方法二:
awk 'NR==FNR{a[NR]=$1;count=NR} NR>FNR{b[NR-count]=$1} END{for(i=1;i<=count;i++)print a[i],b[i]}' tmp1.txt tmp2.txt | tee tmp3.txt
方法三:
awk 'NR==FNR{a[NR]=$0} NR>FNR{print a[FNR],$0}' tmp1.txt tmp2.txt | tee tmp3.txt

说明:其中的很多技巧都是从ChinaUnix上收集而来,CU上面的大牛太多了,而且乐于助人,赞一个。

学习awk的blog地址,随时记下来备忘:

之前在看0ops的题目时,有一道题是:

[题]截止到2014.2.23,亚太互联网络信息中心分配给中国大陆的IPv4地址是多少个?
[解]解决方法是:下载文件http://ftp.apnic.net/stats/apnic/2014/delegated-apnic-20140223.gz进行统计分析。文件格式为:

apnic|CN|ipv4|1.2.2.0|256|20110331|assigned
等级机构|获得该IP段的国家/组织|资源类型|起始IP|IP段长度|分配日期|分配状态

我当时是用PHP去进行正则匹配然后求和得到330393088,不过后来群里面给出了一个awk的解法,觉得不错,就收集了起来:

wget ftp://ftp.apnic.net/public/apnic/stats/apnic/2014/delegated-apnic-20140223.gz
gzip -d delegated-apnic-20140223.gz
cat delegated-apnic-20140223|grep "|CN|"|grep "ipv4" > ipv4.1.txt
awk -F "|" '{print $5}' ipv4.1.txt>ipv4.2.txt
awk '{sum+=$1;i++} END{print sum}' ipv4.2.txt

上面用到了grep/awk,而且最后直接就用的是awk进行的求值,值得注意。

还有一个类似的技巧:实时查询中国有多少个 IP
实时查询中国被分配到的有多少个 IP ? 如何计算 ?
这个数字你可以从 APNIC 取得,并计算出来:
wget http://ftp.apnic.net/stats/apnic/delegated-apnic-latest
(cat delegated-apnic-latest | grep -i ‘CN|ipv4′ | cut -f 5 -d’|’ | tr ‘n’ ‘+’; echo 0) | bc

 

一些学习awk的资源:
,

《“Awk的一些技巧总结[不定期更新]”》 有 1 条评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注