padrão grep interpretado diferentemente em 2 sistemas diferentes com a mesma versão do grep

2

Fabricamos um dispositivo linux para data centers, e todos estão executando o fedora a partir do mesmo processo de kickstart. Existem diferentes versões de hardware, algumas com discos rígidos IDE e algumas SCSI, então os sistemas de arquivos podem estar em / dev / sdaN ou / dev / hdaN.

Nós temos uma interface web para esses dispositivos que mostram o uso do disco, que é gerado usando "df | grep / dev / * da". Isso geralmente funciona para ambas as versões de hardware, dando uma saída como segue:

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

No entanto, para uma máquina, obtemos o seguinte resultado desse comando:

Binary file /dev/sda matches

Parece que seus arquivos grepping correspondem a / dev / * da para um padrão desconhecido por algum motivo, somente nesta caixa que é aparentemente idêntica na versão grep, pacotes, kernel e hardware. Troquei o padrão grep para "/dev/.da" e tudo funciona como esperado nesta caixa problemática, mas detesto não saber por que isso está acontecendo. Alguém tem alguma ideia? Ou talvez alguns outros testes para tentar?

    
por Lance Woodson 25.09.2012 / 16:11

3 respostas

2

Provavelmente, a máquina que está retornando a mensagem Binary file... tem mais de um disco, provavelmente uma unidade de CD ou algo assim.

O que está acontecendo é que, se você não proteger o padrão, ele será expandido pelo shell. Isso significa que

grep /dev/*da

... é expandido para

grep /dev/hda /dev/sda

... o que significa para grep, olhar no arquivo / dev / sda e retornar todas as linhas que combinam com o texto '/ dev / hda'.

Você precisa proteger o padrão, como

grep '/dev/.da'

... para que a casca não a expanda.

Você pode confirmar isso na máquina incorreta digitando

ls /dev/*da
    
por 25.09.2012 / 16:36
0

Eu acho que o problema é sobre como o shell envia '/ dev / * da' para o grep. Experimente

echo /dev/*da 

em ambos os sistemas.

Enfim, acho que a versão correta é /dev/.da porque para grep * significa 'O item anterior será correspondido a zero ou mais vezes'.

    
por 25.09.2012 / 16:36
0
# 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.
    
por 25.09.2012 / 16:48

Tags