Se alguém deveria 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 cuspir também em qual arquivo cada linha é separada?
Eu tentei usar a -H
opção para grep que de acordo com man
diz print the filename for each match
mas no meu shell apenas diz
(standard input):$DATABASE_FUNCTION = dothis();
Respostas:
Não use gato para isso. Em vez disso, use
grep DATABASE *
ougrep -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.fonte
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 degrep 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.fonte