Linux 命令和 Shell 技能
awk:当列成为程序时
当列成为工作单元时,awk 就是您所需要的:nginx 访问日志、/etc/passwd、df 输出、字段中的任何内容。它是一门完整的语言(变量、数组、算术、模式动作规则),披着俏皮话的外衣,这正是日志取证的正确伪装。诚实的边界:awk 能轻松完成的任何事情都是单行代码,而任何需要一页块的事情都是尚未承认自身的 Python 脚本。
要点
- 字段分割是核心技巧: awk -F: '$3 >= 1000 {print $1}' /etc/passwd 列出真实用户,-F'[,|]' 在 cut 已经放弃时处理多字符分隔符。
- 使用关联数组进行计数: awk '{count[$1]++} END {for (c in count) print count[c], c}' /var/log/secure 将任何日志转换为一行中的频率表。
- NR 和 NF 回答文件问题:“NR==1”是标题行,“{print NF}”计算每行的列数,并将 NR 与另一个文件的保存值进行比较以查找重复项和间隙。
- Match plus extract 是日常面包: awk '/ 500 / {print $7, $9}' access.log 会提取带有 URL 的错误页面,OFS 允许您在编辑单个字段后重新打印 $0,而无需自己重写该行。
- BEGIN 和 END 块是聚合工作的所在:BEGIN 设置分隔符,中间规则每行运行,END 打印总计;三块读起来很好,五块是伪装的剧本。
- 引用是 shell 单引号的真正敌人:单引号程序,双引号里面的文字,记住双引号 shell 字符串中的 $7 根本不会到达 awk。
- 数字工作得到 LC_ALL=C:数字中的语言环境逗号和奇数排序规则会横向比较和排序,固定语言环境只需一行就可以节省一个下午的时间。
- 了解上限:CSV、嵌套 JSON 或有状态多行格式中的引号转为 Python; awk 是一把手术刀,并且始终是一把手术刀。
一线手记
一个 awk 单行语句用语言环境逗号对日志中的美元列进行求和,生成的数字在会计打开报告之前无人质疑。 LC_ALL=C 那周搬进了我们的别名库并留下来。
常见问题
awk 或 cut 用于专栏工作?
剪切一个固定分隔符和一个普通的列列表; awk 条件、正则表达式、算术或聚合出现时,无论如何,此时 cut 都超出了其深度。
如何对列求和或求平均值?
END 中的聚合: awk '{s += $5} END {print s, s/NR}' 跨行添加并平均字段 5;如果区域设置将逗号放入数字中,则首先删除千位分隔符。
为什么我的 awk 单行代码在 macOS 上的行为不同?
macOS 附带了一个 POSIX awk,没有 GNU 扩展,如 -i inplace 或 gensub;在 Linux 上运行的脚本可能会悄然失败,因此请保持 POSIX 风格的单行代码或随身携带 gawk。
awk 可以解析 JSON 吗?
没有意义:JSON 没有 awk 可以理解的列结构,并且正则表达式 hacks 会破坏嵌套对象。当作业增长时,使用 jq(awk 的 JSON 形状)或 Python 的 json 模块。
Kinetikatech 如何在linux 命令和 shell 技能方面为您提供帮助
您不必自己成为linux 命令和 shell 技能专家:决定管理员是操作服务器还是对抗服务器的命令和脚本编写习惯:使用每个基本安装中的工具搜索、转换、传输和监督文本和进程。Linux 服务器安全和服务器管理正是为此而设:配置、加固、监控,并有工程师日夜值守。