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.


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

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


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

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 

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