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?

Yurij73
fuente
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).

Peterph
fuente
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.

kenorb
fuente
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
foad322
fuente
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 .

kenorb
fuente