¿Cómo imprimir la primera línea usando el comando grep?

17

Tengo un archivo llamado file.txt. ¿Cómo puedo imprimir la primera línea solo con el grepcomando?

Nithin Santhosh
fuente
44
Sería head -1 file.txtno funciona?
clk
@steeldriver necesita que sea una respuesta, ya que es la forma de hacerlo con grep, herramienta extrañamente seleccionada para el trabajo.
MelBurslan
1
grepNo es la mejor herramienta para imprimir la primera línea de un archivo. Si simplemente quiso decir que desea imprimir la primera línea coincidente grep, o si tiene algún uso específico grep, háganos saber de qué se trata. Si tuviéramos más contexto, quizás podríamos dar una respuesta que te ayudaría mejor a ti y a la comunidad.
DKing
@MelBurslan En file.txt tengo tres líneas, por ejemplo: Este es un archivo nuevo. Segunda línea: el nombre del archivo es nuevo Archivo Tercera línea: no he creado la nueva línea. Entonces, usando el comando grep, ¿cómo puedo imprimir solo la primera línea? Además, ¿qué comando me ayudará a imprimir la primera y la última línea? ¿Pueden ustedes decirme los comandos para ambas preguntas?
Nithin Santhosh
Si alguna de las respuestas existentes resuelve su problema, considere aceptarla a través de la marca de verificación. ¡Gracias!
Jeff Schaller

Respuestas:

38

Aunque es una aplicación no convencional de grep, puedes hacerlo usando

grep -m1 "" file.txt

Funciona porque la expresión vacía coincide con cualquier cosa, mientras que -m1hace que grep salga después de la primera coincidencia

-m NUM, --max-count=NUM
       Stop reading a file after NUM matching lines.
conductor de acero
fuente
+1 por mostrar que el plátano cubierto de chocolate no es tan inútil aquí como pensaba.
Kamil Maciorowski
44
Eso podría funcionar en algunos sistemas, pero no es portátil:grep: unknown option -- m
Kusalananda
1
Tenga en cuenta la diferencia entre 'primera línea' y 'primera línea coincidente'
Charles
13

Esto no es algo que grephace. El nombre "grep" en sí mismo es un acrónimo de " buscar globalmente una expresión regular e imprimir", que es lo que hace el edcomando g/re/p(para una expresión regular dada re).

edes un editor de línea interactivo de 1969, pero probablemente esté instalado en su sistema hoy. Obtuvimos grepde ed, y puede verse como un acceso directo o alias para una funcionalidad específica de ed, y sed, que es "stream- ed", es decir, un editor de stream (no interactivo).

Usemos en su sedlugar:

$ sed -n '1p' file.txt

La 1pcadena es un pequeño sed"script" que imprime ( p) la línea correspondiente a la dirección dada ( 1, la primera línea). Por cierto, el comando de edición 1pharía (no es de extrañar) hacer lo mismo en el ededitor.

El -nsuprime la salida de cualquier elemento no impresa explícitamente por el guión, así que todo lo que tenemos es la primera línea del archivo file.txt.

Alternativamente:

$ sed '1q' file.txt

Esto imprime todas las líneas del archivo, pero se cierra ( q) en la línea 1 (después de imprimirlo). Esto es exactamente equivalente a head -n 1 file.txt.

En el estándar POSIX dice (generalizando) que head -n Nes muy similar a sed 'Nq', es decir, "imprime cada línea, pero cierra en la línea N". La razón por la que headse incluyó en el estándar se debió a la simetría con tail(y la compatibilidad con las implementaciones de Unix existentes).

Kusalananda
fuente
Esta es la respuesta más esclarecedora, la primera respuesta es un truco extraño. Sabía que había algo extraño, gracias por mostrarme la historia de grep and ed. Todo tiene sentido ahora.
Tomas Zubiri
6

A menos que la primera línea tenga una cadena única, no puede hacer esto usando solo grep. head -n 1 file.txtfuncionaría en su lugar.

Si solo desea imprimir la primera línea si coincide con un patrón, coloque el cabezal en grep

head -n 1 * | grep [pattern]

Kurt Heisel
fuente
2

Otro uso no convencional de Grep: una transformación de Schwartz que pasa por varios giros para numerar las líneas, luego usa grep para buscar el número de línea, luego quita el número de línea:

function grep1() (
  nlines=$(wc -l < "$1")
  nlw=$(printf "%d" "$nlines" | wc -c)
  nl -d '\n' -ba -n ln -w "$nlw" -s ' ' "$1" | grep '^1 ' | sed 's/^1 *//'
)

function greplast() (
  nlines=$(wc -l < "$1")
  nlines=$((nlines + 0))
  nlw=$(printf "%d" "$nlines" | wc -c)
  nl -d '\n' -ba -n ln -w "$nlw" -s ' ' "$1" | grep "^$nlines " | sed "s/^$nlines *//"
)

Estoy poniendo esta respuesta aquí como un ejemplo de la idea de que sólo porque usted puede hacer algo en (grep o bash o ... etc), no significa que usted debe - es probable que haya una mejor herramienta para el trabajo. sed ( sed 1qor sed -n 1p) y head ( head -n 1) son las herramientas más apropiadas para imprimir la primera línea desde un archivo. Para imprimir la última línea de un archivo, tiene tail -n 1osed -n '$p'. Estas herramientas no solo son un solo comando (en lugar de 3+ en las funciones anteriores), sino que también son mucho más claras para futuros lectores, ¡tal vez usted mismo! - de los guiones en los que están. Aunque no soy uno de los (actualmente 3) votantes negativos de su pregunta, es probable que su insistencia en una herramienta arbitraria para el trabajo (sin ninguna razón de apoyo) sea la razón de Los votos negativos. Es muy poco probable que un sistema que tiene grepno tenga también head, taily sed.

Jeff Schaller
fuente