在两个具有相同 grep 版本的不同系统中,grep 模式的解释不同

在两个具有相同 grep 版本的不同系统中,grep 模式的解释不同

我们为数据中心制造了 Linux 设备,所有设备都运行从同一 kickstart 进程安装的 Fedora。硬件版本不同,有些带有 IDE 硬盘,有些带有 SCSI,因此文件系统可能位于 /dev/sdaN 或 /dev/hdaN。

我们在这些设备中有一个 Web 界面,用于显示磁盘使用情况,使用“df | grep /dev/*da”生成。这通常适用于两个硬件版本,输出如下:

/dev/sda2              5952284   3507816   2137228  63% /
/dev/sda5             67670876   9128796  55049152  15% /data
/dev/sda1               101086     11976     83891  13% /boot

但是,对于一台机器,我们从该命令得到以下结果:

Binary file /dev/sda matches

似乎出于某种原因,它只在这个 grep 版本、软件包、内核和硬件似乎相同的机器上 grep 匹配 /dev/*da 的文件。我将 grep 模式切换为“/dev/.da”,一切在这个麻烦的机器上按预期工作,但我不知道为什么会发生这种情况。有人有什么想法吗?或者也许可以尝试其他测试?

答案1

返回消息的机器可能Binary file...拥有多个磁盘,可能是 CD 驱动器或类似的东西。

实际情况是,如果你不保护模式,它将被外壳扩展。这意味着

grep /dev/*da

...扩展为

grep /dev/hda /dev/sda

...这意味着 grep,在文件 /dev/sda 中查找并返回与文本 '/dev/hda' 匹配的所有行。

你需要保护图案,例如

grep '/dev/.da'

...这样外壳就不会扩大它。

您可以在有问题的机器上输入以下命令来确认

ls /dev/*da

答案2

我认为问题在于 shell 如何将 '/dev/*da' 发送给 grep。尝试

echo /dev/*da 

在两个系统上。

无论如何,我认为正确的版本是 /dev/.da,因为对于 grep * 来说,意思是“前面的项目将匹配零次或多次”。

答案3

# echo -e '#!/bin/sh\ndf | grep /dev/*da' > df.sh
# sh -x df.sh 
+ df
+ grep /dev/hda /dev/sda
Binary file /dev/sda matches

man grep

   -a, --text
          Process a binary file as if it were text; this is equivalent to the --binary-files=text option.

   --binary-files=TYPE
          If the first few bytes of a file indicate that the file contains binary data, assume that the file
          is  of type TYPE.  By default, TYPE is binary, and grep normally outputs either a one-line message
          saying that a binary file matches, or no message if there is no match.  If TYPE is  without-match,
          grep  assumes  that a binary file does not match; this is equivalent to the -I option.  If TYPE is
          text, grep processes a binary file as if it were text;  this  is  equivalent  to  the  -a  option.
          Warning:  grep  --binary-files=text might output binary garbage, which can have nasty side effects
          if the output is a terminal and if the terminal driver interprets some of it as commands.

相关内容