web-dev-qa-db-ja.com

awkにbash変数を挿入する方法は?

  1. Awkにbash変数を挿入する方法(たとえば、一部のforループで行う必要があります-このように:最初の反復でawkを使用して最初の列、次に2番目の列などで文字列を検索しますdiffent pattern bash変数から awkで)

または

  1. パターンを(文字列として)にする簡単な方法を見つけ、それを引数としてawkに受け取ります。

Awkにbash変数を挿入しようとしています-

ログがあります-

$ cat > log
test1
test2
ahaha
hahah

私がやります

$ cat log | awk '$1~/test1|test2/ {print }'
test1
test2

大丈夫

awkにbash変数を貼り付ける必要があります

$ a=test1
$ b=test2

それから私は挿入しようとします

$ cat log | awk 'BEGIN{a;b} $1~/a|b/ {print }'
ahaha
hahah

$ cat log |  awk -v a=test1 -v b=test2 '$1~/a|b/ {print }'
ahaha
hahah

すべてのパターンを文字列として作成し、引数としてawkで受け取る方法-

$ p='$1~/test1|test2/ {print }'

$ cat log | awk p
# get test1
# get test2
3
dmgl

Awkは/.../内の変数を展開しません。

だが

$ cat log |  awk -v a=test1 -v b=test2 '$1 ~ a || $1 ~ b {print }'

そして

$ p='$1~/test1|test2/ {print }'
$ cat log |  awk "$p"

動作するはずです(テストされていません)

3
JJoao

パターンを変数としてawkに渡し、動的パターンを使用して明示的に比較します(つまり、文字列のパターンと照合します)...

awk -v pat="$a|$b" '$1 ~ pat' log

または

awk -v a="$a" -v b="$b" '$1 ~ a "|" b ' log

注:静的パターン/.../を使用することはできません(またはダーティクォート/エスケープを使用することによってのみ)。

3
Janis

Awkのスコープ外の変数を入力します( 'を閉じて再度開きます)。

cat log | awk '$1~/'${a}'|'${b}'/ {print }'
0
Walter A