Como passar variável de string como parâmetro para awk

4

Eu tenho o seguinte comando:

usb_soundcard_sink=$(pactl list short sinks | grep "alsa_output" | awk '{ print $2 }' | tail -n1)

saída deste comando é:

alsa_output.pci-0000_00_1b.0.analog-stereo

E este é outro comando que encontra o número do índice:

var=$(pactl list short sinks | awk '$2=="alsa_output.pci-0000_00_1b.0.analog-stereo" {print $1}')

saída:

0

Mas eu quero passar a variável "usb_soundcard_sink" em vez de um valor codificado, ou seja, "alsa_output.pci-0000_00_1b.0.analog-stereo" no comando acima. O valor b'coz da variável "usb_soundcard_sink" pode mudar dinamicamente.

Também tentei o seguinte:

var=$(pactl list short sinks | awk '$2=="$usb_soundcard_sink" {print $1}')

Mas não está funcionando

então como posso passar o valor da variável "usb_soundcard_sink" para o comando acima

    
por Prakash V Holkar 28.04.2014 / 12:26

3 respostas

17

Para usar variáveis bash dentro do seu awk, você precisa usar a sintaxe -v desta forma:

pactl list short sinks | awk -v myvar="$usb_soundcard_sink" '$2==myvar {print $1}'
#                               ^^^^^                            ^^^^^
#                                 |________________________________|

Exemplo

$ a=3
$ awk -v myvar="$a" 'BEGIN{print myvar}'
3
    
por fedorqui 28.04.2014 / 12:37
4

Descobri que isso também funciona

line=myfile.dat
f=8
s=11
echo $line | awk '{print $'$f',$'$s'}'

Aqui eu tenho um arquivo chamado myfile.dat enviado para o awk, que mostra as colunas 8 e 11.

    
por User-Z 26.08.2014 / 20:59
0

Tanto o MAWK (versão padrão do AWK do Ubuntu) quanto o GAWK lêem argumentos de linha de comando que não são opcionais no formulário identifier=value como atribuições de variáveis, que são executadas logo após as instruções BEGIN terem sido executadas:

% echo | mawk -- '{print var}' var=foo 
foo
% echo | gawk -- '{print var}' var=foo
foo
% echo foo bar baz | mawk -- '{$1=$1}1' OFS=,
foo,bar,baz
% echo foo bar baz | gawk -- '{$1=$1}1' OFS=,
foo,bar,baz

Eu prefiro este método para a opção -v porque mantém o comando mais limpo, separando claramente as opções a serem passadas para o interpretador e os detalhes do programa.

De man mawk :

The command line arguments divide into three sets: file arguments, assignment arguments and empty strings "". An assignment has the form var=string. When an ARGV[i] is examined as a possible file argument, if it is empty it is skipped; if it is an assignment argument, the assignment to var takes place and i skips to the next argument; else ARGV[i] is opened for input.

De man gawk :

If a filename on the command line has the form var=val it is treated as a variable assignment. The variable var will be assigned the value val. (This happens after any BEGIN rule(s) have been run.) Command line variable assignment is most useful for dynamically assigning values to the variables AWK uses to control how input is broken into fields and records. It is also useful for controlling state if multiple passes are needed over a single data file.

    
por kos 12.05.2016 / 09:15