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]$