Come stampare solo la prima corrispondenza con grep


14

Sto provando a grep username:

users | grep "^\b\w*\b" -P

Come posso ottenerlo per mostrare solo la prima partita con grep?


3
Perché grep? grepè per la ricerca. Sembra che tu abbia bisogno di uno cuto awk, ma anche il readbuilt-in sembra adatto.
arte

questo lavoro come proposto da @peterph ^ \ w * \ b. Cut o sed / awk sono più comodi? il mio caso è semplice. posso usare myVar = `users | grep -o "^ \ w * \ b" `, no?
Yurij73,

3
Confrontarli: users | cut -d' ' -f1, users | sed 's/\s.*//', users | awk '$0=$1'. Se si desidera memorizzarlo in una variabile, usando bash: read myVar blah < <(users)o read myVar blah <<< $(users).
arte

@ Yurij73 la differenza sta principalmente nel tempo di esecuzione. con readte non generare un nuovo processo. Se lo fai molte volte, noterai la differenza.
peterph

È meglio usare awk? #! / bin / bash (utenti | awk '$ 0 = $ 1')> file; leggi myVar <file; file rm -f; echo $ myVar;
Yurij73,

Risposte:


9

Se vuoi davvero restituire solo la prima parola e vuoi farlo grepe la tua grepè una versione recente di GNU grep, probabilmente vuoi l' -oopzione. Credo che tu possa farlo senza il -Pe \ball'inizio non è davvero necessario. Quindi: users | grep -o "^\w*\b".

Tuttavia, come accennato da @manatwork, la shell integrata reado cut/ sed/ awksembra essere più appropriata (in particolare una volta arrivato al punto dovresti fare qualcosa di più).


Sintassi alternativa:grep -o "[^ ]*"
kenorb,

@kenorb che in realtà è un po 'diverso (ma funzionerà nella maggior parte dei casi).
peterph,

34

Per mostrare solo la prima partita con grep, usa il -mparametro, ad es .:

grep -m1 pattern file

-m num, --max-count=num

Smetti di leggere il file dopo che num corrisponde.


1

ha funzionato per me. La prima partita catturata con:

users | grep -m 1 "^\b\w*\b"

e l'ultima partita prende

users | grep "^\b\w*\b" |tail -1

0

Perché grep? Il grepcomando è per la ricerca. Sembra che tu abbia bisogno di uno cuto awk, ma anche la lettura incorporata sembra adatta.

Confrontali:

users | cut -d' ' -f1
users | sed 's/\s.*//'
users | awk '$0=$1'

Se vuoi memorizzarlo in una variabile, usando bash:

read myVar blah < <(users)

o:

read myVar blah <<< $(users). 

Sopra risposta basata sui commenti di @manatwork .

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.