Considere el siguiente archivo de entrada:
1
2
3
4
Corriendo
{ grep -q 2; cat; } < infile
no imprime nada Esperaría que se imprima
3
4
Puedo obtener el resultado esperado si lo cambio a
{ sed -n 2q; cat; } < infile
¿Por qué el primer comando no imprime el resultado esperado?
Es un archivo de entrada que se puede buscar y según el estándar en OPCIONES :
-q
Quiet. Nothing shall be written to the standard output, regardless of
matching lines. Exit with zero status if an input line is selected.
y más abajo, bajo USO DE LA APLICACIÓN (enfatizar el mío):
La
-q
opción proporciona un medio para determinar fácilmente si existe o no un patrón (o cadena) en un grupo de archivos. Al buscar varios archivos, proporciona una mejora en el rendimiento ( porque puede salir tan pronto como encuentra la primera coincidencia ) [...]
Ahora, según el mismo estándar (en Introducción , en ARCHIVOS DE ENTRADA )
Cuando una utilidad estándar lee un archivo de entrada que se puede buscar y finaliza sin un error antes de que llegue al final del archivo, la utilidad se asegurará de que el desplazamiento del archivo en la descripción del archivo abierto se coloque correctamente justo después del último byte procesado por la utilidad [. ..]
tail -n +2 file
(sed -n 1q; cat) < file
...
El segundo comando es equivalente al primero solo cuando el archivo es buscable.
¿Por qué grep -q
consume todo el archivo?
Esto es gnu grep
si importa (aunque Kusalananda acaba de confirmar que sucede lo mismo en OpenBSD)
grep
es una bifurcación de algo llamado FreeGrep , si alguien se lo pregunta.