ファイルの各行に対してawk内からシェルコマンドを実行しようとしていますが、シェルコマンドには1つの入力引数が必要です。 system()
を使用しようとしましたが、入力引数を認識しませんでした。
このファイルの各行はファイルのアドレスであり、そのファイルを処理するコマンドを実行したいです。したがって、簡単な例では、各行に「wc」コマンドを使用し、$1
to wc。
awk '{system("wc $1")}' myfile
あなたは近いです。コマンドラインをawk変数と連結する必要があります。
awk '{system("wc "$1)}' myfile
Awk system()
呼び出しの出力を取得することはできません。終了ステータスのみを取得できます。 getline/pipe または getline/variable/pipe 構文を使用します
awk '{
cmd = "your_command " $1
while (cmd | getline line) {
do_something_with(line)
}
close(cmd)
}' file
参考までに、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セクションのループで出力します。
または、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 にあります。これは私が書いた記事です。