2009-01-12 13 views
25

¿Cómo canalizo la salida de grep como el patrón de búsqueda para otra grep?Salida de tubería para usar como la especificación de búsqueda para grep en Linux

A modo de ejemplo:

grep <Search_term> <file1> | xargs grep <file2> 

Quiero la salida de la primera grep como término de búsqueda para la segunda grep. El comando anterior trata el resultado del primer grep como el nombre del archivo para el segundo grep. Intenté usar la opción -e para el segundo grep, pero tampoco funciona.

+0

relacionadas: * [Leer expresión para grep de la entrada estándar] (http://stackoverflow.com/questions/6641731) * –

Respuesta

8

Si se utiliza Bash entonces usted puede utilizar acentos abiertos:

> grep -e "`grep ... ...`" files 

la bandera -e y las comillas dobles están ahí para asegurarse de que cualquier salida del grep inicial que comienza con un guión no se interpreta como una opción para el segundo grep.

Tenga en cuenta que el truco de las dobles comillas (que también asegura que la salida de grep se trata como un único parámetro) solo funciona con Bash. No parece funcionar con (t) csh.

Tenga en cuenta también que los backticks son la forma estándar de obtener la salida de un programa en la lista de parámetros de otro. No todos los programas tienen una manera conveniente de leer los parámetros de stdin de la misma forma que (f) grep.

+1

Éste podría tener un problema si el primer grep devuelve más de un resultado. –

+0

Probé la solución, funciona. Gracias por proporcionarlo. –

10

Trate

grep ... | fgrep -f - file1 file2 ... 
+1

¿Qué hace esto? –

+0

Utiliza la salida de la primera grep como el patrón grep para la segunda grep, como la pregunta formulada. –

+2

@ Nathan, usa la salida de la primera grep como archivo de entrada de patrones para fgrep. "-f -" es la forma normal de decirle a un programa Unix que use una entrada estándar como archivo de entrada si normalmente toma un archivo de entrada. Tradicionalmente fgrep era el único grep que tomaba un archivo como entrada, aunque es posible que Gnu haya modificado los otros greps. –

12

Es necesario utilizar xargs 's -i interruptor:

grep ... | xargs -ifoo grep foo file_in_which_to_search 

Esto toma la opción después de -i (foo en este caso) y reemplaza cada ocurrencia de la misma en el comando con la salida del primer grep.

Esto es lo mismo que:

grep `grep ...` file_in_which_to_search 
+1

xargs replstr opción utiliza una mayúscula -I en OS X – Sphinges

-1

He encontrado el siguiente comando para trabajar utilizando $() con mi primer comando dentro del paréntesis para que el shell ejecute en primer lugar.

grep $(dig +short) file 

Utilizo esto para buscar en los archivos una dirección IP cuando recibo un nombre de host.

4

Quería buscar texto en archivos (usando grep) que tenían un cierto patrón en sus nombres de archivo (encontrado usando find) en el directorio actual. He utilizado el siguiente comando:

grep -i "pattern1" $(find . -name "pattern2") 

Aquí patrón2 es el patrón de los nombres de archivos y pattern1 es el patrón buscado dentro de los archivos que coinciden patrón2.

editar: No es estrictamente tubería, pero sigue estando relacionada y bastante útil ...

2

Esto es lo que utilizo para buscar un archivo de un anuncio:

ls -la | grep 'file-in-which-to-search' 
1

Está bien romper las reglas ya que esto no es una respuesta, sólo una nota que no puedo conseguir ninguna de estas soluciones trabajar.

% fgrep -f test file 

funciona bien.

% cat test | fgrep -f - file 
fgrep: -: No such file or directory 

failed.

% cat test | xargs -ifoo grep foo file 
xargs: illegal option -- i 
usage: xargs [-0opt] [-E eofstr] [-I replstr [-R replacements]] [-J replstr] 
      [-L number] [-n number [-x]] [-P maxprocs] [-s size] 
      [utility [argument ...]] 

failed. Tenga en cuenta que un capital I es necesario. Si uso eso, todo está bien.

% grep "`cat test`" file 

funciona un poco en que devuelve una línea para los términos que coinciden sino que también devuelve una línea grep: line 3 in test: No such file or directory para cada archivo que no encuentra una coincidencia.

¿Me falta algo o solo son diferencias en mi distribución Darwin o Bash Shell?

1

Lo intenté de esta manera, y funciona muy bien.

[[email protected] abc]$ cat a 
not problem 
all 
problem 
first 
not to get 
read problem 
read not problem 

[[email protected] abc]$ cat b 
not problem xxy 
problem abcd 
read problem werwer 
read not problem 98989 
123 not problem 345 
345 problem tyu 

[[email protected] abc]$ grep -e "`grep problem a`" b --col 
not problem xxy 
problem abcd 
read problem werwer 
read not problem 98989 
123 not problem 345 
345 problem tyu 

[[email protected] abc]$ 
Cuestiones relacionadas