Linux 命令和 Shell 技能
grep:像专业人士一样搜索 Linux
grep 在每次工具链刷新中都能幸存,因为工作永远不会改变:找到文本中重要的行,这些行的增长速度比任何人清理它的速度都快。它真正的力量在于将搜索转化为答案的标志词汇:周围上下文、文件名列表、反向匹配以及 shell 脚本可以分支的退出代码。当服务器行为不当时,调查会从 grep 开始,而且比任何人承认的情况更常见的是,调查也到此结束。
要点
- 有目的地递归搜索: grep -rni 'fail2ban' /var/log --include='*.log' 自行跳过二进制文件和压缩档案; /var/log 上的 grep -r 会以缓慢的方式教授这一课。
- 上下文使匹配可读:-A 3 显示后面的行,-B 3 显示前面的行,-C 5 两者; -l 仅列出文件名,-c 计算每个文件的匹配数,-L 将列表反转为缺少的内容。
- 退出代码是合约的一部分:0表示匹配,1表示不匹配,2表示错误;运行 grep -q 并忽略这种区别的脚本会同等对待成功和沉默。
- 链文件安全地列出 null:grep -rlZ 'ssl_protocols' /etc/nginx --include='*.conf' | xargs -0 -r ls -l;删除 Z 和 -0 配对,第一个带有空格的文件名会破坏管道。
- 使用 -E 作为可读交替的默认正则表达式级别,并且仅当您接受它是 BSD grep 不会携带的 GNU 扩展时才使用 -P (环视,\d 类)。
- -F 将模式视为文字文本:更快,并且不受从直接从票证粘贴的变量中潜入的正则表达式元字符的影响。
- --exclude-dir=.git 和 --exclude-dir=node_modules 将递归搜索保留在目录之外,而这些目录的存在只是为了减慢它们的速度;在脚本中明确拼写名称,因为大括号扩展是 bash 的便利,而不是 grep 功能。
- 将习惯分开:--color=auto 以实现交互舒适,脚本中没有颜色(转义序列损坏日志),以及 -n(行号),以便下一个人可以找到您粘贴的位置。
一线手记
我曾经在凌晨 2 点对客户的整个原木农场运行了一个裸露的 grep -r,并为我的麻烦获得了四十分钟的默哀;添加 --include='*.log' 和 -l 当场结束票证。现在,包含和退出代码习惯会先于模式执行。
常见问题
为什么 grep 有时会打印“二进制文件匹配”而不是我的行?
匹配项附近的 NUL 字节使 GNU grep 将文件视为二进制文件;添加 -a 强制文本模式或 -I 完全跳过二进制文件,这是混合日志目录的正确默认值。
我应该使用 ripgrep 代替吗?
ripgrep 速度更快,默认情况下会跳过二进制文件和隐藏文件,但 grep 存在于您将通过 SSH 连接的每个机器上,包括救援映像。先学grep;找到 rg 恰好安装的地方。
如何搜索旋转的压缩日志?
zgrep 透明地搜索 .gz 文件,并且 zstdgrep 涵盖切换到的较新压缩机轮换;昨天的针通常位于其中之一内,因此这些工具算作基本卫生。
如何匹配一个单词但不匹配包含该单词的较长单词?
使用 -w 进行全字匹配,使用 -x 进行全行匹配;当模式需要单词的一部分时,像 [Ss]erver 这样的字符类可以提供精确的控制,而不会在其他地方压平大小写。
Kinetikatech 如何在linux 命令和 shell 技能方面为您提供帮助
您不必自己成为linux 命令和 shell 技能专家:决定管理员是操作服务器还是对抗服务器的命令和脚本编写习惯:使用每个基本安装中的工具搜索、转换、传输和监督文本和进程。Linux 服务器安全和服务器管理正是为此而设:配置、加固、监控,并有工程师日夜值守。