如何让 (非 gnu-)grep 忽略二进制文件?

如何让 (非 gnu-)grep 忽略二进制文件?

嗨,我在 HP-UX 服务器上。当以递归方式 grep 目录树时,如果目录树还包含二进制文件,我会遇到问题:grep 会将它们视为文本文件,并显示包含大量不可打印字符的很长的行。这不仅使输出难以扫描,而且经常使我的终端无法使用(并在其标题中写入奇怪的字符串)。

GNU-grep 有一个--binary-file=可以提供帮助的选项(并且它不会为二进制文件打印匹配的行),但我没有可用的 GNU-tools。

有没有办法模拟 GNU-grep 的行为或忽略看起来像二进制的文件?

顺便说一句,如果在 perl 中有一种简单的方法可以做到这一点,那就太好了。

答案1

基于上一个答案,您可以使用“file”命令来识别文本文件,然后将 grep 限制为仅针对这些文件。例如:

  find dir -type f -print |
    xargs file |
    grep text |
    cut -f1 -d: |
    xargs grep "expression"

那是:

  • 查找目录“dir”中的所有文件
  • 将这些作为参数传递给“文件”
  • 查找包含单词“文本”的“文件”的输出
  • 删除第一个冒号分隔的字段并将其用作文件名
  • 使用 grep 搜索这些文件。

如果文件名包含空格或冒号,此操作将会失败,但是除此之外,它仍可执行您想要的操作。

答案2

可能有更好的方法,但也许将所有文件传递给 shell 循环,然后使用文件命令执行如下操作:

if file "$i" | grep text; then
  ...
fi

...?

相关内容