利用awk+sed处理文本数据

160 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

awk和sed是linux系统中著名的文本文件处理利器,在日常系统维护过程中会经常使用,这里记录一下处理过的例子

例子1 删除特定列

原始数据

La02C01@ 领教
La02C02= 候教 聆教
La03A01= 承蒙 承情 承 蒙 辱
La03B01= 赏光 赏脸 给面子
La03B02@ 屈就
La04A01= 打扰 打搅 扰
La04B01= 劳驾 劳神 劳动 烦劳 麻烦 烦 劳 累 辛苦 分神 费心 费神 费事 难为 费尽周折 劳心
La04C01= 抱歉 对不起 对不住
La05A01= 久仰 久仰大名 久慕盛名
La05B01= 久违 少见
La05C01= 怠慢 失敬 失礼 不周 怠
La05C02= 失迎 有失远迎
La05D01= 请便 听便 自便 悉听尊便
La06A01= 恭喜 恭贺 贺喜
La06A02@ 同喜
La06B01= 托福 借光
La06C01= 谢谢 多谢 有劳
La06D01= 不谢 不敢当 别客气 好说 彼此彼此
La06D02@ 岂敢
La06D03= 过奖 过誉

使用cat将以上内容写入到dict.txt文件中

cat > dict.txt <<!
以上内容
!

删除所有行的第1列

删除第1例并将新数据 写入dit2.txt,原数据还在dict.txt中

awk '{$1="";print $0}' dict.txt > dict2.txt

删除后效果如下,可以看到第1例前面 出现了一个空格 image.png

将第1列的空格删除

#命令行测试效果echo " A BC " | awk '$1=$1'

#实际操作
cat dict2.txt | awk '$1=$1' > dict3.txt

执行完效果如下图,第1列的空格删除了 image.png

将所有空格替换成逗号

这里空格分隔出来的列,也可以使用逗号替换

cat dict3.txt | sed 's/[ ][ ]*/,/g' > dict5.txt

此时效果就达到了,方便代码访问以下数据了 image.png

以逗号分隔的数据也方便hive数仓处理

例子2 计算指定列的数据

计算nginx状态返回码等于500的行

这里假设 第9列是状态码字码。

#$9 指第9列,$0 指显示该行所有列
cat /var/log/nginx/access.log | awk '{print $9,$0}' | awk '$1==500{print $0}'

基于awk提供的运算方法(==),再加上linux命令行其他工具,就可以计算更多的结果

除了==(等于)运算符,还支持<(小于) >(大于) 等其它的运算符,更多请查看官方文档(www.gnu.org/software/ga…)

统计nginx POST请求总和

利用wc -l 命令,可以求和

#$10 指向post字段的列
cat /var/log/nginx/access.log | awk '{print $10,$0}' | awk '$1=="POST"{print $0}' | wc -l

统计某个接口请求总和

#$11 指向interface字段的列
cat /var/log/nginx/access.log | awk '{print $11,$0}' | awk '$1=="POST"{print $0}' | wc -l