Comment imprimer uniquement la première correspondance avec grep

14

J'essaie de grep le nom d'utilisateur:

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

Comment puis-je le faire afficher uniquement le premier match avec grep?

Yurij73
la source
3
Pourquoi grep? grepest pour la recherche. Vous semblez avoir besoin de l'un cutou de l' autre awk, mais la fonction readintégrée semble également appropriée.
manatwork
ce travail comme @peterph a proposé ^ \ w * \ b. Les coupures ou les sédiments / awk sont-ils plus pratiques? mon cas est simple. je peux utiliser myVar = `users | grep -o "^ \ w * \ b" `, non?
Yurij73
3
Comparez les: users | cut -d' ' -f1, users | sed 's/\s.*//', users | awk '$0=$1'. Si vous souhaitez le stocker dans une variable, utilisez bash: read myVar blah < <(users)ou read myVar blah <<< $(users).
manatwork
@ Yurij73 la différence réside principalement dans le temps d'exécution. avec readvous ne déclenchez pas un nouveau processus. Si vous faites cela plusieurs fois, vous remarquerez la différence.
peterph
Est-il préférable d'utiliser awk? #! / bin / bash (utilisateurs | awk '$ 0 = $ 1')> fichier; lire le fichier myVar <; fichier rm -f; echo $ myVar;
Yurij73

Réponses:

9

Si vous voulez vraiment retourner juste le premier mot et que vous voulez le faire grepet que vous grepêtes une version récente de GNU grep, vous voulez probablement l' -ooption. Je crois que vous pouvez le faire sans le -Pet \ble début n'est pas vraiment nécessaire. Par conséquent: users | grep -o "^\w*\b".

Pourtant, comme l'a mentionné @manatwork, le shell intégré readou cut/ sed/ awksemble être plus approprié (en particulier une fois que vous arrivez au point où vous devez faire quelque chose de plus).

peterph
la source
Syntaxe alternative:grep -o "[^ ]*"
kenorb
@kenorb qui est un peu différent en fait (mais qui fonctionnera dans la plupart des cas).
peterph
34

Pour afficher uniquement la première correspondance avec grep, utilisez le -mparamètre, par exemple:

grep -m1 pattern file

-m num, --max-count=num

Arrêtez de lire le fichier après une correspondance avec num.

kenorb
la source
1

cela a fonctionné pour moi.la première prise de match avec:

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

et le dernier match avec

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

Pourquoi grep? La grepcommande est pour la recherche. Vous semblez avoir besoin de cutou awk, mais la lecture intégrée semble également appropriée.

Comparez-les:

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

Si vous souhaitez le stocker dans une variable, en utilisant bash:

read myVar blah < <(users)

ou:

read myVar blah <<< $(users). 

Réponse ci-dessus basée sur les commentaires @manatwork .

kenorb
la source