Шаблон grep интерпретируется по-разному в 2 разных системах с одинаковой версией grep

Мы производим Linux-устройства для центров обработки данных, и все они работают на Fedora, установленном по одному и тому же процессу. Существуют разные версии аппаратного обеспечения, некоторые с жесткими дисками IDE и некоторые SCSI, поэтому файловые системы могут быть в /dev/sdaN или /dev/hdaN.

У нас есть веб-интерфейс для этих устройств, который показывает использование диска, который генерируется с помощью "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

Похоже, что его файлы grepping совпадают с / dev / * da по неизвестному шаблону по какой-то причине, только в этом окне, которое, по-видимому, идентично в версии grep, пакетах, ядре и оборудовании. Я изменил шаблон grep на "/dev/.da", и все работает, как и ожидалось, на этой проблемной коробке, но я ненавижу не знать, почему это происходит. У кого-нибудь есть идеи? Или, может быть, другие тесты, чтобы попробовать?

3 ответа

Решение

Вероятно, машина, которая возвращает Binary file... сообщение содержит более одного диска, вероятно, дисковод компакт-дисков или что-то.

Происходит следующее: если вы не защитите шаблон, он будет расширен оболочкой. Это означает, что

grep /dev/*da

... расширяется до

grep /dev/hda /dev/sda

... что означает grep, посмотрите в файле /dev/sda и верните все строки, соответствующие тексту /dev/hda.

Вы должны защитить образец, такой как

grep '/dev/.da'

... так что оболочка не расширяет его.

Вы можете подтвердить это на компьютере-нарушителе, набрав

ls /dev/*da
# 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.

Я думаю, что проблема в том, как оболочка отправляет '/dev/*da' в grep. Пытаться

echo /dev/*da 

на обеих системах.

В любом случае, я думаю, что правильной версией является /dev/.da, потому что для grep * означает "Предыдущий элемент будет совпадать ноль или более раз".

Другие вопросы по тегам