awk -v 変数の代入

awk -v 変数の代入

*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\nttl\n

set one two three2=two²これは、事前に実行していない場合や一部のシェルで実行していない場合は、シェル内argv=(one two three)の位置パラメータを動的に変更する方法です。

おすすめ記事