私はこれを持っています:
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