Tengo varias líneas recuperadas de un archivo después de ejecutar el comando grep de la siguiente manera:
var=`grep xyz abc.txt`
Digamos que obtuve 10 líneas que consisten en xyz como resultado.
Ahora necesito procesar cada línea que obtuve como resultado del comando grep. ¿Cómo procedo para esto?
grep -o
este tipo de cosas. La-o
bandera devolverá solo el texto que coincida, con una coincidencia por línea de salida. (No es exhaustivo, por lo queecho aaa |grep 'a*'
solo te da "aaa" y omite las tres coincidencias parciales "", "a" y "aa")Respuestas:
Una de las formas fáciles es no almacenar la salida en una variable, sino iterar directamente sobre ella con un ciclo while / read.
Algo como:
Hay variaciones en este esquema dependiendo de exactamente lo que buscas.
Si necesita cambiar las variables dentro del ciclo (y hacer que ese cambio sea visible fuera de él), puede usar la sustitución del proceso como se indica en la respuesta de fedorqui :
fuente
while read p || [[ -n $p ]]; do ...
(tomado de stackoverflow.com/questions/1521462/… )Puede hacer el siguiente
while read
bucle, que se alimentará del resultado delgrep
comando utilizando la llamada sustitución de proceso:De esta manera, no tiene que almacenar el resultado en una variable, sino "inyectar" directamente su salida al bucle.
Tenga en cuenta el uso
IFS=
y deread -r
acuerdo con las recomendaciones de BashFAQ / 001: ¿Cómo puedo leer un archivo (flujo de datos, variable) línea por línea (y / o campo por campo)? :En cuanto a la sustitución del proceso, se explica en la página de hackers de bash :
fuente
for
versión. Intenté hacer un bucle"${$(grep xyz abc.txt)[@]}"
como en stackoverflow.com/a/14588210/1983854 pero no pude. Así que solo dejo la primera versión.zsh
, donde ese tipo de anidamiento probablemente funcione).while IFS= read -r result <&3
ydone 3< <(grep ...
Sugeriría usar awk en lugar de grep + algo más aquí.
awk '$0~/xyz/{ //your code goes here}' abc.txt
fuente
//your code goes here
?Sin ninguna iteración con la opción grep --line-buffered:
Ejemplo de la vida real con una salida del comando de depuración del enrutador Symfony PHP Framework, para seleccionar todas las rutas relacionadas con "api":
fuente
tail -f some.log
, en mi caso) ...A menudo, el orden del procesamiento no importa. GNU Parallel está hecho para esta situación:
Si el procesamiento es más como:
y
myprogram
es lento, entonces puedes ejecutar:fuente
Iterar sobre los resultados grep con un ciclo while / read. Me gusta:
fuente
Para aquellos que buscan una línea:
fuente