コロンで区切られた値行があり、これをawkで処理したいと思います。行の先頭に変数が含まれている場合、$4
行は異なる方法で処理されます。$3
だから私は次のような表現を書きました。$4 ~ /^$3/
しかし、残念ながらこれはうまくいかず、決して一致しません。こんにちは、正規表現パターンで変数を使用する方法は?
全体の例は次のとおりです。
green="$(tput setaf 2)"
red="$(tput setaf 1)"
yellow="$(tput setaf 3)"
normal="$(tput sgr0)"
stacks=$(docker stack ls --format='{{.Name}}')
for stack in ${stacks}; do
status=$(docker stack ps --filter="desired-state=running" --format="{{.Name}}:{{.Node}}:{{.DesiredState}}:{{.CurrentState}}:{{.Error}}" ${stack})
if test -z "$status"; then
echo "${red}$stack$: disabled${normal}"
else
awk -F: '
$4 ~ /^$3/ {print "GOOD '"${green}"'" $1 ": " $4 "'"${normal}"'"}
$4 !~ /^$3/ {print "BAD '"${yellow}"'" $1 ": " $3 " ≠ " $4 $5 "'"${normal}"'"}
' <<<${status}
fi
done
結果は常に次のようになりますBAD
。たとえば、ここでは次のようになります。
bind_bind.1:urknall:Running:Running 18 hours ago:
印刷する必要がGOOD
ありますが、代わりに次のものを印刷します。
BAD bind_bind.1: Running ≠ Running 18 hours ago
ベストアンサー1
文字列のaの右側に正規表現を入れることができます~
。構文である必要はありません/.../
。 (違いは、実行時またはコンパイル時にREを解析することに関連している可能性がありますがわかりません。)awk
ドル記号は、シェルやPerlのように変数の拡張を意味しないため、リンクする必要があることに注意してください。$3
文字列の残り:
最初は一致しますが、2番目は一致しません。
$ echo 'foo fo+' |awk '$1 ~ "^" $2'
foo fo+
$ echo 'foo o+' |awk '$1 ~ "^" $2'
$
/^$2/
テキストを含み、行末アンカーである$2
正規表現として扱われます。$
EOL以降は何も所有できないため、REは決して一致しません。