シェル変数を取得する awk
  
  いくつかの方法で行うことができます。いくつかは他よりも優れています。これはそれらのほとんどをカバーするはずです。コメントがあれば下に書いてください。v1.5
使用-v  (最善の方法、最もポータブル)
使用する-vオプションを:(PSの後にスペースを使用する-v。あるいは、それは以下のポータブルになります例えば、awk -v var=ではありません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"[|][|][|]"
  プログラム/関数インからawk(ここでは日付が使用されます)にデータを取得する例
awk -v time="$(date +"%F %H:%M" -d '-1 minute')" 'BEGIN {print time}'
コードブロック後の変数
ここでは、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を含む)のhere-stringを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
コード内の変数:USE WITH CAUTION
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この方法で多くのコマンドを追加できます。無効なコマンドでクラッシュすることさえあります。
追加情報:
二重引用符の使用
変数を二重引用符で囲むことは常に良いことです。"$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と変数に関する詳細情報
このFAQを読んでください。