Use um parâmetro de script no awk

8

Aqui está o meu script (para encontrar os arquivos que contêm um padrão especificado):

find . -type f -exec awk -v vawk="$1" '/'"$vawk"'/ {c++} c>0 {print ARGV[1] ; exit 0 } END { if (! c) {exit 1}}' \{\} \;

Eu gostaria de usar meu script com um argumento:

MyScript.sh pattern

Meu problema é que não consegui colocar a variável $ 1 no awk.

Quando tento depurar meu script

bash -x MyScript.sh pattern

Aqui está a saída:

+ find . -type f -exec awk -v vawk=pattern '// {c++} c>0 {print ARGV[1] ; exit 0 } END { if (! c) {exit 1}}' '{}' ';'

A variável $ vawk parece estar vazia.

Alguma ideia?

    
por Nicolas 05.10.2012 / 20:26

2 respostas

7

Você parece estar confundindo variáveis awk e variáveis de shell. awk -v vawk="$1" cria uma variável awk chamada vawk , mas você está tentando usar a sintaxe shell ( $vawk ). Isso não funciona porque o shell não tem uma variável chamada vawk . Eu acho que o que você quer é

awk -v vawk="$1" '$0 ~ vawk { c++ } # ...'
#                      ^ awk variable syntax
    
por 05.10.2012 / 20:31
5

Reproduzido de isto está encerrado como uma questão duplicada já que inclui avisos sobre as limitações da passagem do awk que podem ser úteis.

Uma variável shell é apenas isso: uma variável shell . Se você quer transformá-lo em uma variável awk , você precisa de uma sintaxe como:

awk -v x="$x" '$2 == x {print $1}' infile

ou

awk '$2 == x {print $1}' x="$x" infile

No entanto, eles sofrem de um problema: as sequências de escape são expandidas neles.

Assim, por exemplo, se a variável shell contiver os dois caracteres barra invertida e n , a variável awk acabará contendo a nova linha personagem.

Outra abordagem (mas que requer um awk ou nawk POSIX (em oposição ao awk original, como ainda é encontrado em alguns Unices ímpares)) é usar variáveis de ambiente:

x="$x" awk '$2 == ENVIRON["x"] {print $1}' infile

Outra abordagem (ainda com awks mais recentes) é usar o array ARGV no awk:

awk 'BEGIN {x = ARGV[1]; delete ARGV[1]}
  $2 == x {print $1}' "$x" infile
    
por 20.11.2012 / 11:44

Tags