Awkでシェル変数を使用する

Awkでシェル変数を使用する

私はこれを持っています:

if [[ $1 = "-c" ]] && [[ $2 =~ ^[a-z A-Z]+$ ]]
then
awk -v var="$2" '{print $2}' something.txt
fi

-c abc私が望むのは、some.txtに含まれている行を表示するコマンドを使用することですabc

答え1

grepを使用してください:

grep abc something.txt

$2また、シェル(ご存知のように)第二の主張について言及していますが、awk違います。あなたの質問は、これについて誤解を示しているように明確にします。

シェルは$変数の値を引用する必要があります。したがって、をmyvar作成して名前付き変数を参照します$myvar

awk名前付き変数を参照するには、myvarその名前を使用しますmyvar。 myvar文字を含むリテラル文字列を参照するには、と入力します"myvar"

スーダン$awk大地具体的な数字。 so は、$2ファイルの現在行の 2 番目のフィールドを表します。または を設定すると、myvar = "4"$myvarを参照します。第四ファイルフィールド。

指定されたパターンに一致するファイルのすべての行を印刷するには、次のようにします。grepこれがまさに設計されたものです。

答え2

免責事項として、awkは作業に適したツールではありません。実際のユースケースがより複雑で合理的であると仮定するので、これを整理していただきありがとうございます!

この特定の問題は、変数「拡張」とbashからawkに引数を渡すという2つの問題に帰結するようです。

awk変数と$

awk変数の前にプレフィックスを付けると、$すぐにフィールドへの参照になります。シェル、PHP、またはPerlに精通している場合は、これがおかしいことがあります。

だからこんな入力

thing alive
cat yes
lamp no

パイプを通過するawk 'BEGIN{alive=2}{print $alive}'

alive
yes
no

そしてawk 'BEGIN{alive=2}{print alive}'生産する

2
2
2

awkとbashを混ぜると状況が少し変になります。これが最初の部分に役立つことを願っています。

bashからawkにパラメータを渡す

awkを使用することを決定し、bashコマンドにawk変数を設定する場合は、おそらく次のものを探しています。

if [[ $1 = "-c" ]] && [[ $2 =~ ^[a-z A-Z]+$ ]]
then
    awk -v var="$2" 'index($0, var)' something.txt
fi

注:はindex($0, var)略語です。if (index($0, var)) { print $0 }


もちろん、これは「良い」解決策ではありませんが、awkが操作に誤ったツールであるという問題に戻ります。完全なawkソリューションを見るには、以下を確認してください。ARGVそしてARGC

関連情報