シェル変数をawkに/ pattern /として渡します。

シェル変数をawkに/ pattern /として渡します。

私のシェル関数の1つの内容は次のとおりです。

function _process () {
  awk -v l="$line" '
  BEGIN {p=0}
  /'"$1"'/ {p=1}
  END{ if(p) print l >> "outfile.txt" }
  '
}

したがって、asが呼び出されると_process $argas$argが渡され、$1検索パターンとして使用されます。シェル拡張がawkモードを置き換えるので、これはうまくいきます$1lawkプログラム内でも使用できます-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"

おすすめ記事