Cómo imprimir solo la primera coincidencia con grep


14

Estoy tratando de grep nombre de usuario:

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

¿Cómo puedo hacer que solo muestre el primer partido grep?


3
¿Por qué grep? grepes para buscar Parece que necesita cualquiera cuto awk, pero la readconstrucción también parece adecuada.
manatwork

este trabajo como @peterph propuso ^ \ w * \ b. ¿Los cortes o sed / awk son más convenientes? Mi caso es simple. puedo usar myVar = `usuarios | grep -o "^ \ w * \ b" `, ¿no?
Yurij73

3
Compararlos: users | cut -d' ' -f1, users | sed 's/\s.*//', users | awk '$0=$1'. Si desea almacenarlo en una variable, use bash: read myVar blah < <(users)o read myVar blah <<< $(users).
manatwork

@ Yurij73 la diferencia radica principalmente en el tiempo de ejecución. con readustedes no generan un nuevo proceso. Si haces esto muchas veces, notarás la diferencia.
Peter

¿Es mejor usar awk? #! / bin / bash (usuarios | awk '$ 0 = $ 1')> archivo; leer myVar <archivo; rm -f archivo; echo $ myVar;
Yurij73

Respuestas:


9

Si realmente desea devolver solo la primera palabra y desea hacer esto grepy grepresulta ser una versión reciente de GNU grep, probablemente desee la -oopción. Creo que puedes hacer esto sin el -Py \bal principio no es realmente necesario. Por lo tanto: users | grep -o "^\w*\b".

Sin embargo, como mencionó @manatwork, el shell incorporado reado cut/ sed/ awkparece ser más apropiado (particularmente una vez que llegue al punto que necesitaría hacer algo más).


Sintaxis alternativa:grep -o "[^ ]*"
kenorb

@kenorb, que en realidad es un poco diferente (pero funcionará en la mayoría de los casos).
Peter

34

Para mostrar solo la primera coincidencia con grep, use el -mparámetro, por ejemplo:

grep -m1 pattern file

-m num, --max-count=num

Deja de leer el archivo después de num num.


1

funcionó para mí. la primera captura del partido con:

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

y el último partido atrapado con

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

0

¿Por qué grep? El grepcomando es para buscar. Parece que necesita cualquiera cuto awk, pero la lectura incorporada también parece adecuada.

Compararlos:

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

Si desea almacenarlo en una variable, use bash:

read myVar blah < <(users)

o:

read myVar blah <<< $(users). 

La respuesta anterior se basa en los comentarios de @manatwork .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.