シェルスクリプト変数をAWKコマンドに渡す


3

次のコマンドを含むシェルスクリプトを呼び出すことができます。

awk -F $'\xE7' '{OFS ="¬"} { $3 = sprintf("%010s". $3) ; print $0 }' > outputfile

ただし、このコマンドにシェルスクリプト変数を渡して$3、AWKコマンド内の置換に使用できるようにしたいと思います。

このAWKコマンドにシェルスクリプト変数を渡すにはどうすればよいですか?

回答:


-1

単一引用符は展開を禁止します。それらを切り替えます。

awk ... '...'"$foo"'...' ...

1
番号!これは、foo二重引用符で囲まれたの値をawkスクリプトの一部として扱います。$foo二重引用符またはバックスラッシュが含まれている場合、すべての地獄が崩れる可能性があります。動作するソリューションについては、デニスの答えを参照してください。
ジル

@Gilles:二重引用符で囲むことはありません。シェルは、渡す前にすべての外部引用符を削除します。また、二重引用符が開かれる前に一重引用符が閉じられ、その逆も同様であるため、外部引用符と見なされます。
イグナシオバスケス-アブラムス

ああ、そうです、私はあなたの引用を誤って解析しました、そしてあなたが書いたものはある意味賢明です-の価値fooはawkスクリプトの断片になります-しかし、それが質問にどのように答えるかわかりません。@ mattm123:あなたが何をしようとしているのか正確にはわかりませんが、シェル変数の内容をawkの文字列として使用することを考えている場合は、デニスの答えを参照してください。
ジル

Gillesは$foo、サニタイズされていない値を含めることができると、スクリプトがひどく台無しになる可能性があることは正しいです。
-dubiousjim

...がawk '$1=='"$foo"'{print $3}'$foo評価されるとどうなるかを考えてくださいz{next} {print "garbage"} 0。また$foo、通常の文字列が含まれる通常の場合でも、スクリプトが"それを囲むようにする必要があります。デニスの答えは、これを行う正しい方法を示しています。
-dubiousjim

5

これを行う正しい方法は、AWKの変数受け渡し機能を使用することです。また、おそらくOFS一度だけ設定する必要があるため、BEGIN句で設定する必要があります。

awk -F $'\xE7' -v awkvar="$shellvar" 'BEGIN {OFS ="¬"} { $3 = sprintf("%010s". $3) ; print $0, awkvar }' input file > outputfile

次の-v設定にも使用できますOFS

awk -F $'\xE7' -v awkvar="$shellvar" -v OFS ="¬" '{ $3 = sprintf("%010s". $3) ; print $0, awkvar }' input file > outputfile

printあなたがそれをどのように使用したいかを正確に知らなかったため、変数をステートメントに追加しました。


@Gilles:そのタイプの割り当てには引用符は必要ありません。
デニスウィリアムソン

え?シェルに関する限り、awkvar="$shellvar"単純なコマンドの5番目の単語です。引用符awkvar=$shellvarがないと、通常どおりフィールド分割とパス名展開が行われます。
ジル

@Gilles:そのとおりです。申し訳ありませんが、通常のシェル割り当てルールについて考えていました。
デニスウィリアムソン

2

awkにはENVIRON、環境にアクセスするための配列があります。

$ FOO=bar awk 'BEGIN{print ENVIRON["FOO"]}'
bar

これも機能しますが、-v一般的な解決策として推奨される手法です。
-dubiousjim
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.