gato * | grep alguma coisa… em qual arquivo é o resultado?

8

Se alguém deveria executar o seguinte comando

cat * | grep DATABASE

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

Eu tentei usar a -Hopção para grep que de acordo com mandiz print the filename for each matchmas no meu shell apenas diz

(standard input):$DATABASE_FUNCTION = dothis();
Jake Wilson
fonte
boa pergunta. Eu ainda estou tentando quebrar o hábito de gato -> grep. :)
Sirex

Respostas:

22

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

Veja o uso inútil de gato .

Para esclarecer um pouco mais: cat *na verdade concatena todos os arquivos à medida que os alimenta para grep através do canal, para que o grep não tenha como saber qual conteúdo pertence a qual arquivo e, na verdade, nem mesmo pode saber se está digitalizando arquivos ou se você está apenas digitando muito rápido. É tudo um grande fluxo de entrada padrão quando você usa um pipe.

Por fim, -Hé redundante quase com certeza, pois grep imprime o nome do arquivo por padrão quando há mais de um arquivo para pesquisar. Pode ser de alguma utilidade no caso de você querer analisar a saída, pois há alguma possibilidade de o *globo se expandir para um único arquivo e o grep nesse caso omitir o nome do arquivo.

Eduardo Ivanec
fonte
6

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

O problema que você está cat *enfrentando é que, com o seu comando, concatena todos os arquivos juntos em uma grande bagunça e |envia isso para a entrada padrão de grep DATABASE. No momento em que o grep vê os dados, as informações sobre sua origem foram perdidas. A solução é fazer com que o grep verifique os arquivos individuais; assim, quando encontrar uma correspondência, ele saberá de qual arquivo ele veio.

Gordon Davisson
fonte