Usando a variável com awk -v em um shell script

1

Estou modificando / reescrevendo alguns dos scripts escritos por ex-funcionários da minha empresa e em um dos shell scripts encontrei a seguinte linha.

b='benchmark=30;grep "Waiting for timer" wk.txt | awk -vbenchmark=$benchmark '$6 > benchmark' | wc -l'

Mas, meu mal, não consegui descobrir o que a linha acima está tentando fazer. Estou confuso sobre o uso da variável 'benchmark' aqui. Eu criei um arquivo 'wk.txt' fictício com os seguintes valores e quando a variável ecobled, $ b obteve o valor 1 (que é apenas uma contagem de linha da saída do comando grep + awk.

[sreeraj@server ~]$ cat wk.txt
24  here  above the Waiting for timer 37 make sure

Alguém poderia explicar o que o autor do script está tentando fazer com o benchmark $?

awk man page diz o abaixo para -v , mas não estou entendendo o que isso faz.

-v var=val
--assign var=val
          Assign the value val to the variable var, before execution of the program begins.   Such  variable  values  are
          available to the BEGIN block of an AWK program.
    
por Sree 10.12.2014 / 11:03

2 respostas

3

Se você fizer isso:

awk -v benchmark=30 '...'

Isso é o mesmo que:

awk 'BEGIN{ benchmark = 30 } ... '

Isso é usado para definir um valor inicial para essa variável.

Embora não veja por que o autor:

benchmark=30; ... | awk -v benchmark=$benchmark ..

Eles também podem fazer isso:

... | awk -v benchmark=30 ..
    
por 10.12.2014 / 11:14
2

A confusão pode ser causada pelo fato de que o autor original usou o mesmo nome de variável para o shell:

benchmark=30;gr...

como ele fez dentro de awk :

awk -vbenchmark=$benchmark

que pode ou não pode atribuir o valor da variável de shell benchmark à awk variable benchmark .

Quando awk tiver esse valor ( 30 neste caso), awk verificará se a sexta coluna do arquivo de entrada wk.txt é maior que esse valor:

$6 > benchmark

O teste, usando seu exemplo, é, portanto, a comparação de string:

for > 30

que, embora legal, não faz muito sentido. O exemplo de arquivo de entrada é um exemplo genuíno ou apenas um teste aleatório?

Isso é avaliado como verdadeiro, portanto awk imprime a linha inteira como wc -l , o que conta o número de linhas. Como você só tem uma linha em seu arquivo de entrada, a contagem de linhas em que a sexta coluna é maior que 30 é 1 .

Esse valor é atribuído à variável do shell b .

    
por 10.12.2014 / 12:01