texto regulares palabra expresiones exacta estructura egrep buscar banderas archivos archivo linux grep

linux - palabra - grep expresiones regulares



Salida de tubería para usar como especificación de búsqueda para grep en Linux (8)

Tratar

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

¿Cómo canalizo la salida de grep como el patrón de búsqueda para otro grep?

Como ejemplo:

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

Quiero el resultado del primer grep como el término de búsqueda para el segundo 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.


Si usa Bash, puede usar los trazos:

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

el -e y las comillas dobles están ahí para garantizar que cualquier salida del grep inicial que comience con un guión no se interprete entonces como una opción del segundo grep .

Tenga en cuenta que el truco de la doble cita (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.


Necesita usar el xargs -i xargs:

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 aparición de este en el comando con la salida del primer grep .

Esto es lo mismo que:

grep `grep ...` file_in_which_to_search


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. Utilicé el siguiente comando:

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

Aquí pattern2 es el patrón en los nombres de archivo y pattern1 es el patrón buscado dentro de los archivos que coinciden con pattern2 .

editar: no estrictamente tubería, pero sigue relacionado y bastante útil ...


Esto es lo que uso para buscar un archivo de una lista:

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


He encontrado el siguiente comando para trabajar usando $ () con mi primer comando dentro del paréntesis para que el shell lo ejecute primero.

grep $(dig +short) file

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


Está bien romper las reglas ya que esta no es una respuesta, solo una nota de que no puedo lograr que ninguna de estas soluciones funcione.

% fgrep -f test file

funciona bien.

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

falla

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

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

% grep "`cat test`" file

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

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


Intenté de esta manera, y funciona genial.

[opuser@vjmachine abc]$ cat a not problem all problem first not to get read problem read not problem [opuser@vjmachine abc]$ cat b not problem xxy problem abcd read problem werwer read not problem 98989 123 not problem 345 345 problem tyu [opuser@vjmachine 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 [opuser@vjmachine abc]$