cat * | grep something… qual arquivo é o resultado?

8

Se alguém fosse executar o seguinte comando

cat * | grep DATABASE

o shell cuspia todas as linhas em * arquivos que continham a palavra DATABASE neles. Existe alguma maneira de também citar o arquivo que cada linha é separada de?

Eu tentei usar a opção -H para o grep que, de acordo com man diz print the filename for each match , mas no meu shell apenas diz

(standard input):$DATABASE_FUNCTION = dothis();
    
por Jake Wilson 30.06.2011 / 06:53

2 respostas

21

Não use gato para isso. Em vez disso, use grep DATABASE * ou grep -n DATABASE * (se você quiser saber os números de linha, bem como os nomes dos arquivos) diretamente.

Veja o uso inútil do gato .

Para esclarecer um pouco mais: cat * concatena todos os arquivos, pois eles os alimentam no grep, então o grep não tem como saber qual conteúdo pertence a qual arquivo, e na verdade não pode nem mesmo saber se é digitalização de arquivos ou você está digitando muito rápido. É tudo um grande fluxo de entrada padrão quando você usa um pipe.

Por fim, -H é redundante quase com certeza, já que o grep imprime o nome do arquivo por padrão quando ele tem mais de um arquivo para pesquisar. Poderia ser de alguma utilidade caso você queira analisar a saída, já que há uma possibilidade de que o * glob se expanda para um único arquivo e o grep, nesse caso, omitirá o nome do arquivo.

    
por 30.06.2011 / 07:02
6

Use grep -H DATABASE * (nota: se houver mais de um arquivo no diretório, o -H é opcional).

O problema que você está tendo é que, com seu comando, cat * concatena todos os arquivos juntos em uma grande confusão e, em seguida, | envia isso para a entrada padrão de grep DATABASE . No momento em que o grep vê os dados, as informações sobre de onde elas vieram foram perdidas. A solução é fazer com que o grep faça o trabalho de examinar os arquivos individuais, assim, quando encontrar uma correspondência, saberá de qual arquivo ela veio.

    
por 30.06.2011 / 07:06

Tags