So drucken Sie nur die erste Übereinstimmung mit grep

12

Ich versuche, den Benutzernamen zu erfassen:

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

Wie kann ich dafür sorgen, dass nur das erste Spiel mit grepangezeigt wird?

Yurij73
quelle
3
Warum grep? grepist für die Suche. Sie scheinen entweder cutoder zu brauchen awk, aber das readeingebaute scheint auch geeignet.
Manatwork
Diese Arbeit wie von @peterph vorgeschlagen ^ \ w * \ b. Sind geschnitten oder sed / awk bequemer? Mein Fall ist einfach. Ich kann myVar = `users | verwenden grep -o "^ \ w * \ b" `, nein?
Yurij73
3
Vergleichen sie: users | cut -d' ' -f1, users | sed 's/\s.*//', users | awk '$0=$1'. Wenn Sie es in einer Variablen speichern möchten, verwenden Sie bash: read myVar blah < <(users)oder read myVar blah <<< $(users).
Manatwork
@ Yurij73 Der Unterschied liegt hauptsächlich in der Ausführungszeit. mit readdir spawne keinen neuen Prozess. Wenn Sie dies viele Male tun, werden Sie den Unterschied bemerken.
Peterph
Verwendet es besser awk? #! / bin / bash (Benutzer | awk '$ 0 = $ 1')> Datei; lies myVar <Datei; rm -f Datei; echo $ myVar;
Yurij73

Antworten:

8

Wenn Sie wirklich nur das erste Wort zurückgeben möchten und dies mit tun möchten grepund es sich grepzufällig um eine aktuelle Version von GNU handelt grep, möchten Sie wahrscheinlich die -oOption. Ich glaube, Sie können dies ohne das tun -Pund das \bam Anfang ist nicht wirklich notwendig. Daher : users | grep -o "^\w*\b".

Wie @manatwork bereits erwähnt hat, scheint die integrierte Shell readoder cut/ sed/ awkangemessener zu sein (insbesondere, wenn Sie den Punkt erreicht haben, an dem Sie etwas mehr tun müssen).

Peterph
quelle
Alternative Syntax:grep -o "[^ ]*"
Kenorb
@kenorb, was eigentlich ein bisschen anders ist (aber in den meisten Fällen funktioniert).
Peterph
33

grepVerwenden Sie -mParameter, um nur die erste Übereinstimmung mit anzuzeigen, z.

grep -m1 pattern file

-m num, --max-count=num

Hören Sie auf, die Datei zu lesen, nachdem num übereinstimmt.

Kenorb
quelle
1

es hat bei mir funktioniert. Der erste Matchfang mit:

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

und das letzte Match fangen mit

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

Warum grep? Der grepBefehl dient zur Suche. Sie scheinen entweder cutoder zu benötigen awk, aber das eingebaute Lesen scheint auch geeignet zu sein.

Vergleiche sie:

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

Wenn Sie es in einer Variablen speichern möchten, verwenden Sie bash:

read myVar blah < <(users)

oder:

read myVar blah <<< $(users). 

Die obige Antwort basiert auf @ manatwork-Kommentaren .

Kenorb
quelle