2013-12-17 28 views
36

ファイルの各行に対してawk内からシェルコマンドを実行しようとしていますが、シェルコマンドには1つの入力引数が必要です。 system()を使用しようとしましたが、入力引数を認識しませんでした。どのように変数をawkからシェルコマンドに渡すことができますか?

このファイルの各行はファイルのアドレスであり、そのファイルを処理するコマンドを実行したいとします。したがって、私は単純な例として、各行に 'wc'コマンドを使い、$1をwcに渡します。

awk '{system("wc $1")}' myfile 
+0

最初に検索すると、既に100の解決策があります。 – BMW

+2

なぜあなたはawkがこの仕事のための正しいツールだと思いますか? 'xargs'やシンプルなシェル' readline'ループのほうがはるかに簡単であるようです。 –

+1

反対側:なぜこの仕事にwcが最適なツールだと思いますか? awk組み込みの変数や関数のほうがずっと簡単だろうか? –

答えて

49

あなたは近くです。あなたは、awkの変数を使用してコマンドラインを連結する必要があります。

awk '{system("wc "$1)}' myfile 
+0

ありがとう、それは動作します!しかしもう1つの質問?出力を新しい変数に割り当てることはできますか? –

+0

はいできます。 '{newVar = system(...)}' @VahidMir – Kent

+5

これは、この仕事の構文が間違っています。これはsystem()のアプリケーションが間違っているため、印刷物はあなたがすると思われることをしません。 system()呼び出しの出力をawk変数に割り当てます。コメントに投稿したものは、system()の戻りコードを変数に割り当てます。いくつかのコーヒーの時間@ケント! –

34

あなたはawkをsystem()コールの出力をつかむことができない、あなただけの終了ステータスを取得することができます。 getline/pipeまたはgetline/variable/pipe構文を使用し

awk '{ 
    cmd = "your_command " $1 
    while (cmd | getline line) { 
     do_something_with(line) 
    } 
    close(cmd) 
}' file 
+3

+1はシェルコマンドの出力を得る正しい方法ですが、一般的に変数を作成する構文は 'cmd =" your_command \ "" $ 1 "" \ "'ですので、cmdが実行されたときに引数が引用されます。 getlineの結果がゼロより大きいかどうかをテストする必要があります。失敗すると、無限ループに陥るでしょう。 –

+1

+1。 OP、varに出力を格納する必要がある場合は、この回答も受け入れます。私はvarの割り当てに間違っていました。 – Kent

2

FYIここで名前のファイルに保存されます(この例ではWC-ような機能を提供する)ファイルを処理するためのawkを使用する方法は次のとおりです。

gawk ' 
NR==FNR { ARGV[ARGC++]=$0; next } 
{ nW+=NF; nC+=(length($0) + 1) } 
ENDFILE { print FILENAME, FNR, nW, nC; nW=nC=0 } 
' file 

上記の使用をENDFILEのGNU awk他のawkでは、値を配列に格納し、ENDセクションのループで出力します。

0

またはその行がその起源(国)と一緒に、サーバからのすべての禁止IPアドレスを表示します。この

zcat /var/log/fail2ban.log* | gawk '/.*Ban.*/ {print $7};' | sort | uniq -c | sort | gawk '{ "geoiplookup " $2 "| cut -f2 -d: " | getline geoip; print $2 "\t\t" $1 " " geoip}' 

のように、AWKのgetlineと変数に出力をretriveはbashのようにパイプ|を使用geoip-binパッケージを使用します。

gawk '{ "geoiplookup " $2 "| cut -f2 -d: " | getline geoip; print $2 "\t\t" $1 " " geoip}' 

それは単純に言う:コマンド"geoiplookup 182.193.192.4 | -f2 -d:"($ 2あなたが推測可能ように置換されます)を実行し、そのコマンドの結果を置く

そのワンライナーの最後の部分は、私たちに影響を与えるものですgeoip(| getline geoipビット)。次に、何かと何かをgeoip変数の中に印刷します。

完全な例と結果は、私が書いた記事hereです。

関連する問題