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 yo quiere coincidir exactamente con deiauk
. Cuando hago esto:
grep "deiauk" file.txt
obtengo este resultado:
deiauk 1611516 afsdf 765 deiauk1 sdfsfdsfs 1561 51 deiauk2 115151 5454 4
pero yo solo necesito esto:
deiauk 1611516 afsdf 765 deiauk 1611516 afsdf ddfgfgd
Sé que hay «una opción -w
, pero luego mi cadena tiene que ser completa línea.
Comentarios
Responder
Pruebe uno de:
grep -w "deiauk" textfile grep "\<deiauk\>" textfile
Comentarios
- Si tiene un guión ( – ) al final de la cadena, este script lo traerá como resultado, lo cual no se esperaba.
- Corregir @Eve rt: Las palabras incluyen solo caracteres alfabéticos, dígitos y guiones bajos, por lo que si tiene abreviaturas u otros elementos con guiones, esto no funciona.
- @Cyrus Aprendí el segundo mientras usaba vi / vim
*
comando en palabras. - No funciona para ningún carácter especial que tenga, por ejemplo,
org.apache.avro avro
greped conorg.apache.avro avro+mapred
(probado con *) - Use
-wE
para coincidencia de varias palabras (booleano OR)
Respuesta
Intente esto con GNU grep
y marque los límites de las palabras con \b
:
grep "\bdeiauk\b" file
Resultado:
deiauk 1611516 afsdf 765
Ver: http://www.regular-expressions.info/wordboundaries.html
Comentarios
- Gracias, pero ¿por qué esto no funciona para mí?
echo "Enter login: " $vard
grep -E "$\bvard\b" file.txt
- Pruebe
grep "\b${vard}\b" file.txt
- todavía no ' no funciona: /
- Usted ' necesitará
read
:read -p "Enter login: " vard; grep "\b${vard}\b" file.txt
Responda
Si su grep
admite -P
(PCRE), puede hacer:
$ grep -P "(^|\s)\Kdeiauk(?=\s|$)" file.txt deiauk 1611516 afsdf 765 deiauk 1611516 afsdf ddfgfgd
Comentarios
- Esta es la única respuesta que funciona con palabras con guiones.
- Por qué es
\K
( PCRE reinicia el inicio del partido) ¿es necesario? Esta solución propuesta parece funcionar bien sin ella.
Responder
Dependiendo de sus datos reales, podría busque la palabra seguida de un espacio:
grep "deiauk " file.txt
Si sabe que tiene que estar al principio de la línea, búsquela:
grep "^deiauk " file.txt
Comentarios
- Lamentablemente, todas las respuestas además de esta son incorrectas.
- @Shatu ¡Gracias! Así que veamos ' s cuánto tiempo tarda en " burbujear hasta la parte superior " … Yo ' tengo curiosidad porque me gusta agregar respuestas a preguntas antiguas … Creo que se supone que sí, pero lo dudo. Sería bueno para mí, pero realmente útil para los lectores. Para que este sea un buen ejemplo de caso, ¿podría pedirle que escriba un comentario que resuma lo que faltan en las otras respuestas?
- (1) Felicitaciones por llegar a 10K rep. Ahora tiene el privilegio de ver que esta respuesta se dio antes y se eliminó. (2) Siempre es mejor responder la pregunta de la manera más amplia posible, basándose en lo que se dice y no dar una respuesta que funcione solo para los datos de muestra. A partir de los datos de ejemplo de la pregunta, parece que las columnas están separadas por espacios, pero eso no está especificado. Todas las demás respuestas también funcionarán para columnas separadas por tabuladores. (3) Evitó la falla fatal en la respuesta de tachomi (eliminada) agregando
^
, pero todas las demás respuestas funcionan… (Continuación) - ( Continuación) … si la cadena aparece en un campo diferente al primero. (4) Además, todas las demás respuestas funcionan si deiauk es el último campo (es decir, no hay nada después).
Respuesta
Encontré que -x
funcionó para mí.
Ejemplo
$ grep -inx -d skip "favicon.ico" * test.txt:1:favicon.ico
Grep Manual
-x, --line-regexp Select only those matches that exactly match the whole line. For a regular expression pattern, this is like parenthesizing the pattern and then surrounding it with ^ and $.
Comentarios
- Para 1: 1 que coincida con toda la línea que contiene guiones,
-x
la única opción. Por ejemplo,grep -w "abc" <<<"abc-hac101-bb0"
coincidirá perogrep -x "abc" <<<"abc-hac101-bb0"
no
grep -w
? (Esa opción es exactamente para ese propósito , y funciona para mí.) – Nota: la opción-x
coincide con la línea completa.deiauk
/ " Solo necesito esto:deiauk 1611516 afsdf 765
" – ¿cuál necesitas?