Haga coincidir la cadena exacta con grep

65

Tengo un archivo de texto:

deiauk 1611516 afsdf 765
minkra 18415151 asdsf 4152
linkra sfsfdsfs sdfss 4555
deiauk1 sdfsfdsfs 1561 51
deiauk2 115151 5454 4
deiauk 1611516 afsdf ddfgfgd
luktol1 4545 4 9
luktol 1

y quiero coincidir exactamente deiauk. Cuando hago esto:

grep "deiauk" file.txt

Me sale este resultado:

deiauk 1611516 afsdf 765
deiauk1 sdfsfdsfs 1561 51
deiauk2 115151 5454 4

pero solo necesito esto:

deiauk 1611516 afsdf 765
deiauk 1611516 afsdf ddfgfgd

Sé que hay una -wopción, pero mi cadena tiene que mecanizar toda la línea.

usuario3334375
fuente
44
¿Realmente lo has intentado grep -w? (Esa opción es exactamente para ese propósito, y funciona para mí). - Nota: la opción -xcoincide con toda la línea.
Janis
"Quiero coincidir exactamentedeiauk / " Solo necesito esto: deiauk 1611516 afsdf 765" - ¿Qué necesitas?
alex

Respuestas:

129

Pruebe uno de:

grep -w "deiauk" textfile

grep "\<deiauk\>" textfile
Janis
fuente
3
Si tiene un guión ( - ) al final de la cadena, este script lo traerá como resultado, lo que no se esperaba.
Evis
Corregir @Evert: las palabras incluyen solo caracteres alfabéticos, dígitos y guiones bajos, por lo que si tiene abreviaturas u otros elementos con guión, esto no funciona.
ingyhere
@ Cyrus Aprendí el segundo mientras usaba el *comando vi / vim en las palabras.
shuva
No funciona para ningún personaje especial que tenga, por ejemplo, org.apache.avro avrocodificado org.apache.avro avro+mapred(probado con *)
Vishrant
12

Pruebe esto con GNU grepy marque los límites de las palabras con \b:

grep "\bdeiauk\b" file

Salida:

deiauk 1611516 afsdf 765

Ver: http://www.regular-expressions.info/wordboundaries.html

Ciro
fuente
Gracias, pero ¿por qué esto no funciona para mí? echo "Enter login: " $vard grep -E "$\bvard\b" file.txt
user3334375
Pruebagrep "\b${vard}\b" file.txt
Cyrus
1
todavía no funciona: /
user3334375
Necesitarás read:read -p "Enter login: " vard; grep "\b${vard}\b" file.txt
Cyrus
7

Si su grepsoporte -P(PCRE), puede hacer:

$ grep -P '(^|\s)\Kdeiauk(?=\s|$)' file.txt 
deiauk 1611516 afsdf 765
deiauk 1611516 afsdf ddfgfgd
heemayl
fuente
44
Esta es la única respuesta que funciona con palabras con guiones.
ingyhere
5

Dependiendo de sus datos reales, puede buscar la palabra seguida de un espacio:

grep 'deiauk ' file.txt 

Si sabe que tiene que estar al comienzo de la línea, verifíquelo:

grep '^deiauk ' file.txt 
Volker Siegel
fuente
Lamentablemente, todas las respuestas aparte de esto son incorrectas.
Shatu
@Shatu Gracias! Entonces, veamos cuánto tiempo le toma "subir hasta la cima" ... Tengo curiosidad porque me gusta agregar respuestas a viejas preguntas ... Creo que se supone que sí, pero lo dudo. Sería bueno para mí, pero realmente útil para los lectores. Para hacer de este un buen ejemplo, ¿podría pedirle que escriba un comentario que resuma las otras respuestas que faltan?
Volker Siegel
(1) Felicitaciones por llegar a 10K rep. Ahora tiene el privilegio de ver que esta respuesta se dio anteriormente y se eliminó. (2) Siempre es mejor responder la pregunta de la manera más amplia posible, según lo que se diga, y no dar una respuesta que funcione solo para los datos de la muestra. Parece, a partir de los datos de ejemplo en la pregunta, que las columnas están separadas por espacios, pero eso no se especifica. Todas las otras respuestas también funcionarán para columnas separadas por tabuladores. (3) Evitaste la falla fatal en la respuesta (eliminada) de tachomi agregando la ^- pero todas las otras respuestas funcionan ... (Cont.)
G-Man dice 'Reinstate Monica'
(Cont.) ... si la cadena aparece en un campo diferente al primero. (4) Además, todas las otras respuestas funcionan si '' deiauk '' es el último campo (es decir, no hay nada después).
G-Man dice 'Restablecer a Monica' el