2011-07-18 6 views
6

結果解析:AWK:各ライン上にカールを実行し、次の行で入力ストリーム所与

123 
456 
789 
098 
... 

私はxxxは各ラインの数であると

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

を呼び出したい、および毎回awkスクリプトが出力ストリームに書き込まれるカール出力から何らかの情報を取得するようにします。私は、これはawkをを使用せずに、可能であれば疑問に思って「システム()」次のように呼び出す:

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

この質問は、入力がファイルではなく「実際の」ストリームからのものである場合に興味深いものです。例えば、データ(線)を周期的に生成する検知装置。/dev/ttyUSB0にあります。そのような場合、提案された回答(ファイルからの読み込み)は、ストリームからのデータを一時ファイルに格納し、ファイルを定期的に処理する場合(データが処理中に到着した場合はどうなるでしょうか?しかしもっと直接的なアプローチ(パイプを使うこと)はもっと良いかもしれません... –

+0

'cat | grep | grep | grep awk'は 'awk '/^[0-9] + $/{}' file'に単純化することができます。また、どのような構文解析をしたいのですか?おそらく 'awk'を全く使う必要はなく、' while read'ループで十分です。 – fedorqui

答えて

0

シェルループは同様の結果を達成するであろう、次のようにのために

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

代替方法同様のタスクを実行するには、PerlまたはPythonをHTTPクライアントで使用する方法があります。

1

あなたbashを使用して、awkのsystemコールを避けることができます:あなたのファイルを動的にidを追加取得した場合、あなたはこのように、ファイル内でより多くのデータをチェックしておくために、小さなwhileループをデーモン化することができます

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

を:

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

それ以外の場合は、静的だ場合、あなたはbreakからsleep 1を変更することができますし、何のデータLEFが存在しない場合には、ファイルを読み込み、終了しますどのようにするかを知るのにかなり便利です。

関連する問題