Obtener la primera línea de la salida de un comando de shell

96

Al intentar leer el número de versión de vim, obtengo muchas líneas adicionales que necesito ignorar. Intenté leer el manual de heade intenté el siguiente comando:

vim --version | head -n 1

Quiero saber si este es el enfoque correcto.

john doe
fuente
4
¿Cómo fracasó? Esto funciona para mi.
choroba
1
La sintaxis es correcta. ¿Cuál es el error ...?
Kaushik Nayak
1
Eso funciona para mí, pero quizás esté usando una versión de vim que escribe información de versión en stderr. Pruebavim --version 2>&1 | sed 1q
William Pursell
También funciona para mí, así que sí, su enfoque es correcto :)Compruebe si su paquete genera esa información stderrcomo @WilliamPursell proporciona una verificación.
David C. Rankin

Respuestas:

132

Sí, esa es una forma de obtener la primera línea de salida de un comando.

Si el comando genera un error estándar que le gustaría capturar de la misma manera, debe redirigir el error estándar del comando al flujo de salida estándar:

utility 2>&1 | head -n 1

También hay muchas otras formas de capturar la primera línea, incluidas sed 1q(salir después de la primera línea), sed -n 1p(solo imprimir la primera línea, pero leer todo), awk 'FNR == 1'(solo imprimir la primera línea, pero nuevamente, leer todo), etc.

Kusalananda
fuente
4

Yo usaría:

awk 'FNR <= 1' file_*.txt

Como señala @Kusalananda, hay muchas formas de capturar la primera línea en la línea de comando, pero usar el head -n 1puede no ser la mejor opción cuando se usan comodines, ya que imprimirá información adicional. Cambiar 'FNR == i'a 'FNR <= i'permite obtener las primeras i líneas.

Por ejemplo, si tiene n archivos llamados file_1.txt, ... file_n.txt:

awk 'FNR <= 1' file_*.txt

hello
...
bye

Pero con headcomodines imprima el nombre del archivo:

head -1 file_*.txt

==> file_1.csv <==
hello
...
==> file_n.csv <==
bye
alemol
fuente
1
Verhead -qn1 file_*.txt
F. Hauri