Linux三剑客传 | 老大:AWK

那天在实验室,我和小王正在整理一系列的实验数据,有成百上千行,格式很乱。
我拿了一支笔,在白板上画了一个表格标题,然后开始使用 AWK 来过滤所需的值。
嘿嘿,小王看了,说太好了,原来AWK这么厉害。
我随机写了一条命令,echo "1 9 2 .1 6 8 .1 .1 " | awk -F '.' '{print $2 }',嘿,我立即看到了 IP 地址的第二个数字。
等等,还有一件事。
我突然想到,如果能统计出每个IP段出现的次数就好了。
那我们试试看用AWK能不能做到?

linux里awk是做什么的,请详细说明

说实话,使用awk处理文本数据感觉就像在玩益智游戏。
之前在处理服务器日志的时候,离不开它。
我记得有一次,有一个几GB大小的nginx日志文件,里面充满了请求时间、IP和状态码等各种信息。
使用cat看live很眼花缭乱,但是如果使用awk,效果立马就不一样了。

以你提到的例子为例。
我经常使用 -F 选项。
比如有一个排序表,分隔符是逗号。
如果我想捕获每个订单的总金额,我必须首先使用 -F 分隔字段。
我有一个客户端使用的脚本,是awk -F, '{print $4 }' order.csv,直接打印第四列数据。
我经常使用这个技巧,以至于我几乎忘记了还有其他分隔线。

有趣的是,我更喜欢使用awk进行条件过滤。
比如有一个监控数据文件,里面全是时间戳+数值。
如果我想找到所有超过阈值的记录,我将其写为 awk '$3 >1 00' data.log。
这个用法非常简单。
我有一个朋友写了一个 awk 脚本,每天凌晨自动运行,将所有 4 04 系统登录错误收集到一个单独的文件中,省去了我们手动一一查找的麻烦。

说到计算,我更喜欢使用awk进行批量统计。
例如,如果您有销售数据并希望按产品类别计算总销售额,则应使用 awk '{arr[$2 ]+=$3 }END{for(k in arr)print k, arr[k]}' sales.csv。
这种写法我已经用过无数次了,比用Excel方便多了。
当时我不明白为什么这个效果这么好,后来才知道awk自带了这个批量统计功能,非常好用。

但说实话,像 awk 这样的东西用多了也会出问题。
我有一个项目,本来想用Python来处理,但是当我编写它时,它变成了awk脚本。
最后,他跑得快了一半。
我记得测试了大约 3 0,000 行数据。
awk 只用了不到 2 秒就运行完毕,但 Python 实际上挂了将近一分钟。
这个对比是非常尴尬的。

但是我们来谈谈缺点,即awk的语法确实有点复杂。
尤其是嵌套条件或者复杂的正则表达式,每次写完都要反复检查。
我曾经编写过一个脚本,想要过滤包含特定关键字的所有行。
结果我输入了错误的正则表达式,整个文件都被过滤了。
我当时真的很震惊。

一般来说,awk适合处理结构化文本数据,特别是那些字段分隔明确的数据。
如果数据非常混乱,例如自然语言处理或类似的,您应该再次依赖更专业的工具。
但根据我个人的经验,日志分析、生成报告等任务基本上都可以用awk来完成,而且效率非常高。

linux awk怎么截取字符串

substr函数是awk中一个强大的工具,可以直接剪切字符串。

说白了就是$0或者选择字段中的字符。

起始位置从 1 开始,不要搞错。

省略尾巴的长度。

我上周刚刚进行了日志分析,非常方便。

例如,[2 02 3 -1 0-2 7 ],只需 substr($0,2 ,1 0) 即可。

CSV文件是用-F逗号分隔的,截掉第三列的前1 0个字符非常简单。

回声“你好”| substr($0,2 ,3 ) 生成 xam。

末端拦截时利用长度动态计算位置,非常酷。

但注意起始位置必须>=1
首先,你可以亲眼看看。