2009-10-03 21 views
14

Supongamos que tengo varias cadenas: str1 y str2 y str3.grep egrep cadenas múltiples

  • ¿Cómo encontrar líneas que tienen todas las cadenas?
  • ¿Cómo encontrar líneas que pueden tener alguna de ellas?
  • Y cómo encontrar líneas que tienen str1 y cualquiera de str2 y str3 [pero no ambas?]?

Respuesta

-2

Personalmente, hago esto en perl en lugar de intentar improvisar algo con grep.

Por ejemplo, para la primera de ellas:

while (<FILE>) 
{ 
    next if ! m/pattern1/; 
    next if ! m/pattern2/; 
    next if ! m/pattern3/; 

    print $_; 
} 
+3

-1: La búsqueda ion no es: ¿cuál es la mejor herramienta para hacer eso, pero cómo lo hago con grep? – quosoo

+3

Y la respuesta es "No lo hagas con grep, te volverás loco intentando" –

+0

@quosoo: entre los programadores de Unix, "grep" puede referirse específicamente al programa grep o al problema general de buscar un cuerpo de texto para cadenas o patrones. No está claro qué uso pretendía Tim, por lo que creo que la respuesta de Paul Tomblin es acertada. –

8

No se puede razonablemente hacer la búsqueda hacia delante "todos" o "esto además de cualquiera de esos" casos porque grep no soporta. Usa Perl. Para el caso "any", es egrep '(str1|str2|str3)' file.

La forma razonable de hacer el "todo" es el caso:

egrep '(str1.*str2.*str3|str3.*str1.*str2|str2.*str1.*str3|str1.*str3.*str2)' file 

es decir, se construye a cabo las permutaciones. Esto es, por supuesto, algo ridículo.

Para el "esto además de cualquiera de ellos", parecida:

egrep '(str1.*(str2|str3)|(str2|str3).*str1)' file 
27

Esto se parece a tres preguntas. La forma más sencilla de juntar este tipo de expresiones es con varias canalizaciones. No hay vergüenza en eso, particularmente porque una expresión regular (usando egrep) sería desgarbada ya que parece implicar que quiere independencia de orden.

Por lo tanto, con el fin,

  1. grep str1 | grep str2 | grep str3

  2. egrep '(str1 | str2 | str3)'

  3. str1 grep | egrep '(str2 | str3)'

que puede hacer el "y" forma de manera independiente para el uso egrep, pero creo que será más fácil de recordar hacer pedidos ands independientes usando entubados greps y ordene de forma independiente o usando expresiones regulares.

+1

Bien hecho. +1 –

+0

3 no cumple con el requisito "pero no ambos", pero ese requisito es difícil de cumplir. Necesitará que cada lado de la alternancia tenga un prefijo y un sufijo cuidadosamente diseñados, excluyendo que la otra cadena aparezca en cualquier otro lugar de la línea. –

+0

@Michael E: el bit 'pero no ambos' está en cursiva y tiene un signo de interrogación después, porque cuando edité la pregunta, no estaba seguro de qué era lo que quería el asker. @Groundhog escribió su (buena) respuesta antes de refinar/revisar la pregunta con un comentario/enmienda que quizás debería eliminarse. –

3

grep -E -color "texto1 | texto2 | string3 ...."

por ejemplo, para saber si nuestro sistema usando AMD (SVM) o Intel (VMX) y si es de 64 bits (lm) lm significa larga modo-que significa 64 bits ...

ejemplo de comando:

grep -E -color "lm | SVM | vmx"/proc/cpuinfo

-E es imprescindible para Encontrar varias cadenas

Cuestiones relacionadas