
*nix/awk 初心者です。以下の単純なawk -v構文の例にどのような問題があるのか疑問に思います。
# this line produces the expected result, 'xyz'
echo "abc xyz" | /usr/bin/awk -v ttl="$2" '{print $2}'
# but this line does not, it prints a blank line
echo "abc xyz" | /usr/bin/awk -v ttl="$2" '{print ttl}'
上記の-vオプションに私が何を間違っているのでしょうか?
助けてくれてありがとう。
答え1
最初の例を見てみましょう。
echo "abc xyz" | /usr/bin/awk -v ttl="$2" '{print $2}'
これにより、awk
変数が2番目のシェルスクリプトパラメータ¹に設定されます。awk
その後、コードは変数を無視し、変数を次に置き換えます。標準入力、すなわち。xyz
唯一のラインで。印刷するとttl
空であることがわかります。
デフォルトでは、最初のものは$2
シェルによって実行されるシェルパラメータ拡張であり、2番目は各行に対して評価されるawk
フィールド($
数字2に適用される演算子、書き込むこともできます。$ 2
または$ (1 + 1)
...)です。標準入力合格awk
。
それでは、2番目の例を考えてみましょう。
echo "abc xyz" | /usr/bin/awk -v ttl="$2" '{print ttl}'
これにより、awk
変数が2番目のシェルスクリプトパラメータ1に設定されます。その後、コードは空の行awk
ごとにその変数を印刷します。標準入力。
シェル・コンテキストにおける$2
シェル・スクリプトの2番目の引数。コマンドラインから直接実行すると、「2番目の引数」²がないため空です。ただし、スクリプトとして実行すると値がある可能性があります。
#!/bin/sh -
printf 'This is $2: %s\n' "$2"
ファイルに保存demo
して実行可能にしますchmod a+x demo
。今実行して観察してください:
./demo one
./demo one two
./demo one two three
残念ながら、あなたは達成しようとしている目標を教えてくれなかったので、あなたの要件に対する解決策を提案することはできません。しかし、この回答からメッセージを入手してください。
出力するフィールドを指定するには、次のものをttl
使用できます。
$ echo "abc xyz" | awk -v ttl=2 '{print $ ttl}'
xyz
1 ただし、構文を使用すると、値の-v var=value
エスケープシーケンス(たとえば\n
、...)はawkによって拡張されるため、含める場合は代わりに改行文字が含まれます。\v
$2
\n
ttl
\n
set one two three
2=two
²これは、事前に実行していない場合や一部のシェルで実行していない場合は、シェル内argv=(one two three)
の位置パラメータを動的に変更する方法です。
答え2
2番目のケースには$2
値はありません。スクリプトには$2
価値がありますawk
。次のように設定すると:
AAA="test123"
echo "abc xyz" | /usr/bin/awk -v ttl="$AAA" '{print ttl}'
AAA
シェル環境で取得した変数値を出力します。
特定の変数に明示的に使用したい場合は、awk
次のようにします。
echo "abc xyz" | /usr/bin/awk '{ttl=$2;print ttl}'