私のシェル関数の1つの内容は次のとおりです。
function _process () {
awk -v l="$line" '
BEGIN {p=0}
/'"$1"'/ {p=1}
END{ if(p) print l >> "outfile.txt" }
'
}
したがって、asが呼び出されると_process $arg
as$arg
が渡され、$1
検索パターンとして使用されます。シェル拡張がawkモードを置き換えるので、これはうまくいきます$1
!l
awkプログラム内でも使用できます-v l="$line"
。
パターンを変数として同じ方法で検索できますか?
以下は機能しません。
awk -v l="$line" -v search="$pattern" '
BEGIN {p=0}
/search/ {p=1}
END{ if(p) print l >> "outfile.txt" }
'
/search/
、awkはこれを変数として解釈せずに文字通り解釈するからです。
ベストアンサー1
awkの~
演算子を使用すると、右側にリテラル正規表現を提供する必要はありません。
function _process () {
awk -v l="$line" -v pattern="$1" '
$0 ~ pattern {p=1; exit}
END {if(p) print l >> "outfile.txt"}
'
}
exit
残りを読む必要がないため、最初の一致がここで呼び出されます。その必要さえありませんawk
。十分で、おそらくより効率的で、grep
バックスラッシュ処理の問題を避けることができます。awk
-v var='value'
function _process () {
grep -qe "$1" && printf '%s\n' "$line"
}
パターンによっては必要になる場合があります。grep -Eqe "$1"