web-dev-qa-db-ja.com

awkからシェルコマンドに変数を渡すにはどうすればよいですか?

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

このファイルの各行はファイルのアドレスであり、そのファイルを処理するコマンドを実行したいです。したがって、簡単な例では、各行に「wc」コマンドを使用し、$1to wc。

awk '{system("wc $1")}' myfile
41
Vahid Mirjalili

あなたは近いです。コマンドラインをawk変数と連結する必要があります。

awk '{system("wc "$1)}' myfile
57
Kent

Awk system()呼び出しの出力を取得することはできません。終了ステータスのみを取得できます。 getline/pipe または getline/variable/pipe 構文を使用します

awk '{
    cmd = "your_command " $1
    while (cmd | getline line) {
        do_something_with(line) 
    }
    close(cmd)
}' file
40
glenn jackman

参考までに、awkを使用して、ファイルに名前が保存されているファイルを処理する方法を次に示します(この例ではwcのような機能を提供しています)。

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

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

2
Ed Morton

または、bashのようにパイプ|を使用し、awkのgetlineを使用して変数の出力を取得します。

 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}'

この行は、geoip-binパッケージを使用して、サーバーからの禁止されたすべてのIPとそれらのオリジン(国)を出力します。

そのワンライナーの最後の部分は、私たちに影響を与えるものです:

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 にあります。これは私が書いた記事です。

0
ychaouche