シェル変数を取得する 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を読んでください。