awkでシェル変数を使用しないのはなぜですか?

awkでシェル変数を使用しないのはなぜですか?

いくつかの問題を解決するためにawkを使用しようとしていますが、なぜこの行が機能しないのか理解できません。

name="root"
ps -eo user:20,rss | awk "{if(\$1==$name) print \$2}"

通常、私のシステムには所有者がルートですが、出力が空のプロセスがたくさんあります。私がこれを使うとき:

ps -eo user:20,rss | awk '{if($1=="root") print $2}'

すべてが大丈夫で正しい出力を得ましたが、この変数 "name"を使用する必要があるため、このままにすることはできません。何が間違っているかを調べるのに役立ちます。ありがとうございます。

答え1

実行すると、set -x以下が表示されます。

$ ps -eo user,rss | awk "{if(\$1==$name) print \$2}"
+ ps -eo user,rss
+ awk '{if($1==root) print $2}'

引用符がありませんroot。引用符がない場合、awkはそれをroot文字列ではなくawk変数名として扱います。

ただし、awkでシェル変数を使用するには、awk変数をシェル変数の値に設定することをお勧めします。

ps -eo user,rss | awk -v name="$name" '$1 == name {print $2}'

これはまた、awkがawk変数を拡張して正しいテキストを取得するため、引用の問題を回避します。

関連情報