Como passar a variável shell para um padrão de pesquisa awk? [duplicado]

3

No meu script bash eu tenho uma variável que estou tentando passar para um padrão para procurar por awk. No entanto, o que eu esperava que acontecesse não está funcionando. Eu tenho o seguinte arquivo de texto (text.txt):

-----------
Task:           a
 (some info)
  ....
------------
Task:           b 
 (some info)
  ....
------------
Task:           c
 (some info)
  ....
------------

Meu script tem o seguinte:

letter=a
awk -v var="$letter" '/Task .* \var/' RS='-+' text.txt

Quando faço isso, não consigo nada, mas se fizer o seguinte:

awk '/Task .* a/' RS='-+' text.txt

Eu obtenho o que espero:

Task:           a
 (some info)
  ....

NOTA: eu preciso passar isso como uma variável porque eu tenho um loop que está constantemente mudando a variável e é isso que eu estou tentando procurar. Eu prefiro usar o awk desde então com o que eu estou mais familiarizado, mas não me oponho a ouvir outras sugestões como sed ou grep.

    
por pdm 16.07.2015 / 15:32

2 respostas

8

Você poderia passar o padrão inteiro para o awk

letter=a
awk -v pattern="Task .* $letter" -v RS='-+' '
    $0 ~ pattern
' text.txt

ou construa o padrão como uma string no awk

letter=a
awk -v ltr="$letter" -v RS='-+' '
    BEGIN {pattern = "Task .* " ltr}
    $0 ~ pattern
' text.txt

Como as variáveis do awk não são prefixadas com $ , você não pode incorporá-las dentro de um /regex constant/ - é apenas texto lá dentro.

(É minha preferência colocar todas as variáveis do awk na frente com -v )

    
por 16.07.2015 / 15:42
3

Sua melhor escolha talvez seja passar a variável pelo ambiente:

letter=a
p="Task: *$letter" awk -v RS='-+' '$0 ~ ENVIRON["p"]' <file

ou:

p="Task: *a" awk -v RS='-+' '$0 ~ ENVIRON["p"]' <file

Usando -v var=value , awk expandirá as sequências de escape em valor. Se você quiser passar dados como estão para awk do shell, -v var="$shell_var" não é confiável.

Usar ENVIRON (ou ARGV ) é mais confiável, pois awk não expande sequências de escape.

    
por 16.07.2015 / 18:59