2011-07-18 13 views
6

dada una secuencia de entrada con líneas siguientes:AWK: ejecutar CURL en cada línea y analizar resultar

123 
456 
789 
098 
... 

quisiera llamar

curl -s http://foo.bar/some.php?id=xxx 

con xxx es el número para cada línea, y cada vez, deje que un script awk obtenga cierta información del resultado del curl que se escribe en el flujo de salida. Me pregunto si esto es posible sin utilizar el awk "sistema()" llamada en modo siguiente:

cat lines | grep "^[0-9]*$" | awk ' 
    { 
     system("curl -s " $0 \ 
     " | awk \'{ #parsing; print }\'") 
    }' 
+0

Me resulta interesante esta pregunta en situaciones en las que la entrada proviene de un flujo "real", no de un archivo. Por ejemplo, un dispositivo sensor que genera datos (líneas) periódicamente, p. en/dev/ttyUSB0. En tales casos, las respuestas propuestas (lectura de un archivo) son aplicables solo si se almacenan datos del flujo de un archivo temporal y se procesa periódicamente el archivo (¿qué pasa si los datos llegan durante el procesamiento?). Pero un enfoque más directo (usando una tubería) podría ser mejor ... –

+0

Tenga en cuenta que 'cat | grep | awk' se puede simplificar a solo 'awk '/^[0-9] + $/{}' file'. Además, ¿qué tipo de análisis quieres hacer? Tal vez no es necesario utilizar 'awk' en absoluto y basta un ciclo' while read'. – fedorqui

Respuesta

0

Un bucle shell habría lograr un resultado similar, como sigue:

#!/bin/bash 
for f in $(cat lines|grep "^[0-9]*$"); do 
    curl -s "http://foo.bar/some.php?id=$f" | awk '{....}' 
done 

métodos alternativos para realizar tareas similares incluye usar Perl o Python con un cliente HTTP.

1

Puede usar bash y evitar awk system llamada:

grep "^[0-9]*$" lines | while read line; do 
    curl -s "http://foo.bar/some.php?id=$line" | awk 'do your parsing ...' 
done 
0

Si el archivo se dinámicamente añade la década de ID, puede demonizar una pequeña while bucle de seguir buscando más datos en el archivo, así:

while IFS= read -d $'\n' -r a || sleep 1; do [[ -n "$a" ]] && curl -s "http://foo.bar/some.php?id=${a}"; done < lines.txt

De lo contrario si es estático, puede cambiar el sleep 1-break y se leerá el archivo y salga cuando no hay datos LEF t, bastante útil para saber cómo hacerlo.

Cuestiones relacionadas