#シェル変数を取得するにawk
は、いくつかの方法があります。いくつかは他のものよりも優れています。これはそれらのほとんどをカバーするはずです。コメントがある場合は、以下に残してください。v1.5
使用-v
(最良の方法、最もポータブル)
-v
オプションを使用してください: (PS の後にスペースを使用し-v
ないと、移植性が低下します。例: awk -v var=
not awk -vvar=
)
variable="line one\nline two"
awk -v var="$variable" 'BEGIN {print var}'
line one
line two
これはほとんどの と互換性がawk
あり、変数はBEGIN
ブロックでも使用できます。
複数の変数がある場合:
awk -v a="$var1" -v b="$var2" 'BEGIN {print a,b}'
警告。Ed Morton が書いているように、エスケープ シーケンスは解釈されるため、検索対象が\t
実数tab
であり、そうでない場合はそうではありません。使用するか、経由でアクセスすること\t
で解決できますENVIRON[]
ARGV[]
PSセパレーターとして3つの垂直バーが好きな場合|||
は、エスケープできないため、使用してください-F"[|][|][|]"
プログラム/関数 inn からデータを取得する例awk
(ここでは日付が使用されます)
awk -v time="$(date +"%F %H:%M" -d '-1 minute')" 'BEGIN {print time}'
シェル変数の内容を正規表現としてテストする例:
awk -v var="$variable" '$0 ~ var{print "found it"}'
コードブロックの後の変数
ここでは、awk
コードの後に変数を取得します。BEGIN
ブロックに変数が必要ない限り、これは問題なく機能します。
variable="line one\nline two"
echo "input data" | awk '{print var}' var="${variable}"
or
awk '{print var}' var="${variable}" file
awk '{print a,b,$0}' a="$var1" b="$var2" file
- このように
FS
して、ファイルごとに異なるフィールド セパレータを設定することもできます。
awk 'some code' FS=',' file1.txt FS=';' file2.ext
- コード ブロックの後の変数は、ブロックでは機能しません
BEGIN
。
echo "input data" | awk 'BEGIN {print var}' var="${variable}"
ヒアストリング
変数は、それらをサポートするシェル (Bash を含む) からヒア文字列awk
を使用して追加することもできます。
awk '{print $0}' <<< "$variable"
test
これは次と同じです。
printf '%s' "$variable" | awk '{print $0}'
PSこれは変数をファイル入力として扱います。
ENVIRON
入力
TrueY が書いているように、を使用しENVIRON
て環境変数を出力できます。AWK を実行する前に変数を設定すると、次のように出力できます。
X=MyVar
awk 'BEGIN{print ENVIRON["X"],ENVIRON["SHELL"]}'
MyVar /bin/bash
ARGV
入力
Steven Penny が書いているARGV
ように、データを awk に取り込むために使用できます。
v="my data"
awk 'BEGIN {print ARGV[1]}' "$v"
my data
BEGIN だけでなく、コード自体にデータを取得するには:
v="my data"
echo "test" | awk 'BEGIN{var=ARGV[1];ARGV[1]=""} {print var, $0}' "$v"
my data test
コード内の変数: 注意して使用してください
コード内で変数を使用することはできますが、awk
ごちゃごちゃしていて読みにくいため、Charles Duffy
指摘されているように、このバージョンもコード インジェクションの犠牲になる可能性があります。誰かが変数に悪いものを追加すると、awk
コードの一部として実行されます。
これは、コード内の変数を抽出することで機能するため、コードの一部になります。
変数を使用して動的に変化する を作成する場合awk
は、この方法で実行できますが、通常の変数には使用しないでください。
variable="line one\nline two"
awk 'BEGIN {print "'"$variable"'"}'
line one
line two
コード インジェクションの例を次に示します。
variable='line one\nline two" ; for (i=1;i<=1000;++i) print i"'
awk 'BEGIN {print "'"$variable"'"}'
line one
line two
1
2
3
.
.
1000
この方法で多くのコマンドを追加できますawk
。無効なコマンドでクラッシュさせることさえできます。
ただし、このアプローチの有効な使用方法の 1 つは、シンボルを awk に渡して、単純な電卓などの入力に適用する場合です。
$ calc() { awk -v x="$1" -v z="$3" 'BEGIN{ print x '"$2"' z }'; }
$ calc 2.7 '+' 3.4
6.1
$ calc 2.7 '*' 3.4
9.18
シェル変数の値が入力された awk 変数を使用してそれを行う方法はありません。 awk が解釈する前に、シェル変数を展開して awk スクリプトのテキストの一部にする必要があります。
追加情報:
二重引用符の使用
変数を二重引用符で囲むことは常に良いことです"$variable"
。そうでない場合、複数の行が長い単一行として追加されます。
例:
var="Line one
This is line two"
echo $var
Line one This is line two
echo "$var"
Line one
This is line two
二重引用符なしで取得できるその他のエラー:
variable="line one\nline two"
awk -v var=$variable 'BEGIN {print var}'
awk: cmd. line:1: one\nline
awk: cmd. line:1: ^ backslash not last character on line
awk: cmd. line:1: one\nline
awk: cmd. line:1: ^ syntax error
また、一重引用符を使用すると、変数の値は展開されません。
awk -v var='$variable' 'BEGIN {print var}'
$variable
AWK と変数に関する詳細情報
このよくある質問をお読みください。