Como inserir variáveis bash no awk?

2
  1. Como inserir variáveis bash no awk (por exemplo, eu preciso fazer em algum loop for - assim: na primeira iteração use awk para pesquisar string pela primeira coluna, next pela segunda coluna e assim por diante usando padrão diffent de variáveis bash no awk)

ou

  1. encontre a maneira simples de criar padrão (como string) e receba-o como argumento.

Tentando inserir variáveis bash no awk -

Eu tenho algum log -

$ cat > log
test1
test2
ahaha
hahah

eu faço

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

tudo ok

eu preciso colar variáveis bash no awk

$ a=test1
$ b=test2

então eu tento inserir

$ 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

Como fazer todo o padrão como string e recebê-lo como argumento -

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

$ cat log | awk p
# get test1
# get test2
    
por dmgl 10.02.2015 / 17:08

3 respostas

2

Transmita os padrões como variáveis para awk e compare explicitamente usando padrões dinâmicos (ou seja, combine com padrões em strings) ...

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

ou

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

Nota: Você não pode usar padrões estáticos /.../ (ou somente usando citações / escapes sujos).

    
por 10.02.2015 / 17:27
2

O Awk não expande variáveis dentro de /.../ .

Mas

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

e

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

deve funcionar (não testado)

    
por 10.02.2015 / 17:30
0

Preencha as variáveis fora do escopo do awk (fechar 'e abrir novamente):

cat log | awk '$1~/'${a}'|'${b}'/ {print }'
    
por 14.02.2015 / 14:47