Как передать строковую переменную как параметр к awk

У меня есть следующая команда:

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

вывод этой команды:

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

И это - другая команда, которые находят индекс:

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

вывод:

0

Но я хочу, передают "usb_soundcard_sink" переменную вместо твердого кодированного значения т.е. "alsa_output.pci-0000_00_1b.0.analog-stereo" в вышеупомянутой команде. значение b'coz "usb_soundcard_sink" переменной может измениться динамично.

Также я попробовал следующее:

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

Но это не работает

таким образом, как я могу передать значение "usb_soundcard_sink" переменной к вышеупомянутой команде

4
задан 28 April 2014 в 19:56

3 ответа

Для использования переменных удара в awk необходимо использовать -v синтаксис как это:

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

Пример

$ a=3
$ awk -v myvar="$a" 'BEGIN{print myvar}'
3
17
ответ дан 17 November 2019 в 13:37

Я нашел, что это работает также

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

Здесь, у меня есть файл, названный myfile.dat, переданным по каналу в awk, который выкладывает столбец 8 и 11.

$f',

Здесь, у меня есть файл, названный myfile.dat, переданным по каналу в awk, который выкладывает столбец 8 и 11.

$s'}'

Здесь, у меня есть файл, названный myfile.dat, переданным по каналу в awk, который выкладывает столбец 8 и 11.

4
ответ дан 17 November 2019 в 13:37

Оба MAWK (версия AWK Ubuntu по умолчанию) и ПРОСТОФИЛЯ читают параметры командной строки неопции в форме identifier=value как переменные присвоения, которые выполняются прямо после эти BEGIN операторы, были выполнены:

% 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

я предпочитаю этот метод -v опция, потому что это сохраняет инструмент для очистки команды, ясно разделяя опции, которые будут переданы интерпретатору и деталям программы.

От man mawk:

параметры командной строки делятся на три набора: аргументы файла, аргументы присвоения и пустые строки "". Присвоение имеет форму var=string. Когда ARGV [я] исследован как возможный аргумент файла, если это пусто, он пропускается; если это - аргумент присвоения, присвоение на var происходит, и я пропускаю к следующему аргументу; еще ARGV [я] открыт для входа.

От man gawk:

, Если имя файла на командной строке имеет форму var=val это, рассматривается как переменное присвоение. Переменному var присвоят значение val. (Это происходит после того, как любой НАЧИНАЕТ, правило (правила) были выполнены.) Присвоение переменной командной строки является самым полезным для того, чтобы динамично присвоить значения переменным использование AWK, чтобы управлять, как введенный повреждается в поля и записи. Для управления состоянием также полезно, если несколько передач необходимы по единственному файлу данных.

0
ответ дан 17 November 2019 в 13:37

Другие вопросы по тегам:

Похожие вопросы: