Come stampare la prima riga usando il comando grep?


17

Ho un file chiamato file.txt. Come posso stampare la prima riga solo usando il grepcomando?


4
Non head -1 file.txtfunzionerebbe?
clk

@steeldriver devi renderlo una risposta in quanto è il modo di farlo con grep, strumento stranamente selezionato per il lavoro.
MelBurslan,

1
grepnon è lo strumento migliore per stampare la prima riga di un file. Se intendevi semplicemente che volevi stampare la prima riga abbinata grepo se hai un uso specifico per grep, facci sapere di cosa si tratta. Se avessimo più contesto, forse potremmo dare una risposta che aiuterebbe meglio te e la comunità.
DKing

@MelBurslan In file.txt ho tre righe per esempio: questo è un nuovo file. Seconda riga: il nome del file è newFile Terza riga: non ho creato la nuova riga. Quindi usando il comando grep come posso stampare solo la prima riga? Inoltre, quale comando mi aiuterà a stampare sia la prima che l'ultima riga? Ragazzi, potete dirmi i comandi per entrambe le domande?
Nithin Santhosh,

Se una delle risposte esistenti risolve il tuo problema, considera di accettarlo tramite il segno di spunta. Grazie!
Jeff Schaller

Risposte:


38

Sebbene sia un'applicazione non convenzionale di grep, puoi farlo usando

grep -m1 "" file.txt

Funziona perché l'espressione vuota corrisponde a qualsiasi cosa, mentre -m1fa uscire grep dopo la prima corrispondenza

-m NUM, --max-count=NUM
       Stop reading a file after NUM matching lines.

+1 per aver dimostrato che la banana ricoperta di cioccolato non è così inutile qui come pensavo.
Kamil Maciorowski il

4
Potrebbe funzionare su alcuni sistemi, ma non è portatile:grep: unknown option -- m
Kusalananda

1
Nota la differenza tra 'prima riga' e 'prima riga abbinata'
Charles

13

Questo non è qualcosa che grepfa. Il nome "grep" stesso è l'acronimo di " ricerca globale di un'espressione regolare e stampa", che è ciò che fa il edcomando g/re/p(per una determinata espressione regolare re).

edè un editor di linee interattivo del 1969, ma molto probabilmente è installato sul tuo sistema oggi. Siamo arrivati grepa ed, e può essere visto come un collegamento o alias per una funzionalità specifica di ed, e sed, che è "stream- ed", ovvero un editor di stream (non interattivo).

Usiamo sedinvece:

$ sed -n '1p' file.txt

La 1pstringa è un piccolo sed"script" che stampa ( p) la riga corrispondente all'indirizzo indicato ( 1, la prima riga). A proposito, il comando di modifica 1pfarebbe (senza sorpresa) la stessa cosa ednell'editor.

Il -nsopprime l'output di tutto quanto non esplicitamente stampata dallo script, quindi tutto quello che otteniamo è la prima riga del file file.txt.

In alternativa:

$ sed '1q' file.txt

Questo stampa tutte le righe del file, ma esce ( q) alla riga 1 (dopo averlo stampato). Questo è esattamente equivalente a head -n 1 file.txt.

Nello standard POSIX si dice (generalizzando) che head -n Nè più o meno lo stesso sed 'Nq', cioè "stampa ogni riga, ma esci dalla riga N". Il motivo è headstato incluso nello standard a causa della simmetria tail(e della retrocompatibilità con le implementazioni Unix esistenti).


Questa è la risposta più illuminante, la prima risposta è uno strano hack. Sapevo che c'era qualcosa di strano, grazie per avermi mostrato la storia di Grep ed Ed. Adesso ha tutto senso.
Tomas Zubiri,

6

A meno che la prima riga non abbia una stringa univoca, non puoi farlo usando solo grep. head -n 1 file.txtavrebbe funzionato al suo posto.

Se vuoi stampare la prima riga solo se corrisponde a un motivo, allora testa di tubo in grep

head -n 1 * | grep [pattern]


2

Ancora un altro uso non convenzionale di Grep: una trasformazione di Schwartz che attraversa diverse rotazioni per numerare le linee, quindi utilizza grep per cercare il numero di riga, quindi rimuovere il numero di riga:

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 *//"
)

Sto mettendo questa risposta qui come esempio dell'idea che solo perché puoi fare qualcosa in (grep o bash o ... ecc.), Non significa che dovresti - probabilmente c'è uno strumento migliore per il lavoro. sed ( sed 1qo sed -n 1p) e head ( head -n 1) sono gli strumenti più appropriati per stampare la prima riga da un file. Per stampare l'ultima riga di un file, hai tail -n 1osed -n '$p'. Questi strumenti non sono solo un singolo comando (anziché 3+ nelle funzioni sopra), ma sono anche molto più chiari per i futuri lettori - forse te stesso! - degli script in cui si trovano. Sebbene io non sia uno dei (attualmente 3) down-votatori della tua domanda, è probabile che la tua insistenza su uno strumento arbitrario per il lavoro (senza alcun motivo di supporto) sia la ragione di i voti negativi. E 'estremamente improbabile che un sistema che ha grepnon ha anche head, taile sed.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.