2011-07-18 7 views
6

dany strumień wejściowy z następujących linii:AWK: wykonać fałdy na każdej linii i analizować spowodować

123 
456 
789 
098 
... 

Chciałbym zadzwonić

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

z xxx oznacza numer dla każdej linii i za każdym razem pozwól skryptowi awk pobrać trochę informacji z wyjścia curl, które jest zapisane w strumieniu wyjściowym. Ja zastanawiać, czy to jest możliwe, bez użycia awk „układ()” połączenie w sposób następujący:

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

Uważam, że to pytanie jest interesujące w sytuacjach, w których dane wejściowe pochodzą z "prawdziwego" strumienia, a nie z pliku. Na przykład urządzenie wykrywające, które okresowo generuje dane (linie), np. na/dev/ttyUSB0. W takich przypadkach proponowane odpowiedzi (odczyt z pliku) mają zastosowanie tylko wtedy, gdy dane ze strumienia są przechowywane w pliku tymczasowym i okresowo przetwarzają plik (a co jeśli dane zostaną dostarczone podczas przetwarzania?). Ale bardziej bezpośrednie podejście (za pomocą rury) może być lepsze ... –

+0

Zwróć uwagę na 'cat | grep | Awk może być uproszczony do "awk"/^ [0-9] + $/{} "plik". A także, jakiego rodzaju analizowania chcesz wykonać? Być może nie jest konieczne używanie 'awk' w ogóle i wystarczająca jest pętla' while'''''. – fedorqui

Odpowiedz

0

pętla powłoki byłoby uzyskać podobny efekt, co następuje:

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

Alternatywne sposoby wykonywanie podobnych zadań obejmuje używanie Perla lub Pythona z klientem HTTP.

1

Można użyć bash i uniknąć awk system połączenia:

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

Jeśli plik zostanie dynamicznie dołączane identyfikator, można daemonize małą while pętli zaglądać do większej ilości danych w pliku, na przykład:

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

w przeciwnym razie, jeśli jest statyczne, można zmienić sleep 1 do break i to odczytać plik i zamknąć, gdy nie ma LEF dane t, całkiem przydatne, aby wiedzieć, jak to zrobić.