我们为数据中心制造了 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
-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.