如何将字符串变量作为参数传递给awk

Pra*_*kar 4 command-line scripts awk

我有以下命令:

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

此命令的输出是:

alsa_output.pci-0000_00_1b.0.analog-stereo
Run Code Online (Sandbox Code Playgroud)

这是另一个查找索引号的命令:

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

输出:

0
Run Code Online (Sandbox Code Playgroud)

但我想在上面的命令中传递“usb_soundcard_sink”变量而不是硬编码值,即“alsa_output.pci-0000_00_1b.0.analog-stereo”。“usb_soundcard_sink”变量的 b'coz 值可能会动态变化。

我也尝试了以下方法:

var=$(pactl list short sinks | awk '$2=="$usb_soundcard_sink" {print $1}')
Run Code Online (Sandbox Code Playgroud)

但它不起作用

那么如何将“usb_soundcard_sink”变量的值传递给上述命令

fed*_*qui 19

要在 awk 中使用 bash 变量,您必须使用如下-v语法:

pactl list short sinks | awk -v myvar="$usb_soundcard_sink" '$2==myvar {print $1}'
#                               ^^^^^                            ^^^^^
#                                 |________________________________|
Run Code Online (Sandbox Code Playgroud)

例子

$ a=3
$ awk -v myvar="$a" 'BEGIN{print myvar}'
3
Run Code Online (Sandbox Code Playgroud)


小智 5

我发现这也有效

line=myfile.dat
f=8
s=11
echo $line | awk '{print $'$f',$'$s'}'
Run Code Online (Sandbox Code Playgroud)

在这里,我将一个名为 myfile.dat 的文件通过管道传输到 awk 中,该文件会输出第 8 列和第 11 列。