N引数をstdinに渡し、stdinから読み取ることができるようにしたいawkスクリプトがあります。私は次のことができるようにしたいと思います。
tail -f logfile | my_cool_awk_scipt var1 var2 var3 ... varN
次に、スクリプトでこれらの変数を使用します。
#!/bin/awk -f
BEGIN {
print "AWK Script Starting"
print ARGV[1]
}
{
if ($0 < ARGV[1])
print $0
else if ($0 < ARGV[2])
print $0 + ARGV[2]
}
変数を渡そうとすると、印刷された次のARGV[1]
エラーが発生します。
awk: ./my_cool_awk_script:4: fatal: cannot open file `var1' for reading (No such file or directory)
私はできます、
tail -f logfile | my_cool_awk_scipt -v var1=var1 -v var2=var2 -v var3=var3 ... varN=varN
しかし、これは少し制限的で長いです。私はこれをシェルスクリプトでラップすることができることを知っていますが、私が持っているものを似たようなものに含めるためのきちんとした方法があるかどうかはわかりません。
ベストアンサー1
awkがスクリプト本体に到達した瞬間、BEGIN
ARGV [x]で指定されたファイル名を読み取ろうとします。だからちょうど核を撃つ。
$ cat a.awk
#!/bin/awk -f
BEGIN {
print "AWK Script Starting"
ZARGV[1]=ARGV[1]
ZARGV[2]=ARGV[2]
ARGV[1]=""
ARGV[2]=""
}
{
if ($0 < ZARGV[1])
print $0
else if ($0 < ZARGV[2])
print $0 + ZARGV[2]
}
$
例:
$ cat logfile
1
2
3
4
5
$ ./a.awk 3 4 <logfile
AWK Script Starting
1
2
7
$