Considere o seguinte arquivo de entrada:
1
2
3
4
Corrida
{ grep -q 2; cat; } < infile
não imprime nada. Eu esperava que fosse impresso
3
4
Posso obter a saída esperada se a alterar para
{ sed -n 2q; cat; } < infile
Por que o primeiro comando não imprime a saída esperada?
É um arquivo de entrada procurável e de acordo com o padrão em OPTIONS :
-q
Quiet. Nothing shall be written to the standard output, regardless of
matching lines. Exit with zero status if an input line is selected.
e mais abaixo, em USO DO APLICATIVO (enfatize o meu):
A
-q
opção fornece um meio de determinar facilmente se um padrão (ou sequência) existe ou não em um grupo de arquivos. Ao pesquisar vários arquivos, ele fornece uma melhoria de desempenho ( porque pode sair assim que encontrar a primeira correspondência ) [...]
Agora, pelo mesmo padrão (em Introdução , em INPUT FILES )
Quando um utilitário padrão lê um arquivo de entrada procurável e termina sem erro antes de chegar ao final do arquivo, o utilitário deve garantir que o deslocamento do arquivo na descrição do arquivo aberto seja posicionado corretamente logo após o último byte processado pelo utilitário [. ..]
tail -n +2 file
(sed -n 1q; cat) < file
...
O segundo comando é equivalente ao primeiro apenas quando o arquivo é procurável.
Por que grep -q
consome o arquivo inteiro?
Isso é gnu grep
importante (embora o Kusalananda tenha confirmado o mesmo no OpenBSD)
grep
é um fork de algo chamado FreeGrep , se alguém se perguntar.