2

当我这样做时,pactl list我会得到很多信息。在这些信息中,我试图只让部分以 Sink #0 开始,直到该部分结束。

1) 信息

Sink #0
    State: SUSPENDED
    Name: auto_null
    Description: Dummy Output
    Driver: module-null-sink.c
    Sample Specification: s16le 2ch 44100Hz
    Channel Map: front-left,front-right
    Owner Module: 14
    Mute: no
    Volume: 0:   0% 1:   0%
            0: -inf dB 1: -inf dB
            balance 0.00
    Base Volume: 100%
                 0.00 dB
    Monitor Source: auto_null.monitor
    Latency: 0 usec, configured 0 usec
    Flags: DECIBEL_VOLUME LATENCY 
    Properties:
        device.description = "Dummy Output"
        device.class = "abstract"
        device.icon_name = "audio-card"

Source #0
    State: SUSPENDED
    Name: auto_null.monitor
    Description: Monitor of Dummy Output
    Driver: module-null-sink.c
    Sample Specification: s16le 2ch 44100Hz
    Channel Map: front-left,front-right
    Owner Module: 14
    Mute: no
    Volume: 0:  80% 1:  80%
            0: -5.81 dB 1: -5.81 dB
            balance 0.00
    Base Volume: 100%
                 0.00 dB
    Monitor of Sink: auto_null
    Latency: 0 usec, configured 0 usec
    Flags: DECIBEL_VOLUME LATENCY 
    Properties:
        device.description = "Monitor of Dummy Output"
        device.class = "monitor"
        device.icon_name = "audio-input-microphone"

2)我正在尝试,例如:

#!/bin/bash
command=$(pactl list);
# just get Sink #0 section not one line 
Part1=$(grep "Sink #0" $command);
for i in $Part1
do
  # show only Sink #0 lines 
  echo $i;
done

3)它输出很奇怪

grep: dB: No such file or directory

如何使用我的 BASH 脚本获取该部分,还有其他最佳方法来处理此类过滤吗?

跟进:所以我也试图保持简单。如:

pactl list | grep Volume | head -n1 | cut -d' ' -f2- | tr -d ' '
|________|   |________|    |______|   |_____________|  |_________|
  |            |                |              |           |
  command     target get    show 1 row      cut empty      Dont know..
  to list 
4

2 回答 2

2

您可以使用sed编辑器的多个功能来实现您的目标。

 sed -n '/^Sink/,/^$/p'  pactl_Output.txt

-n说“不要执行打印每一行输出的标准选项

/^Sink/,/^$/ 是一个范围正则表达式,表示查找以 Sink 开头的行,然后继续查看行,直到找到空行 ( /^$/)。

最后一个字符,p表示打印您匹配的内容。

如果空行上有空格或制表符,请使用" ...,/^$[${spaceChar}${tabChar}]*\$/p". 请注意从单引号到 dbl-quoting 的变化,这将允许变量 ${spaceChar} 和 ${tabChar} 扩展为它们的实际值。您可能需要转义结束的“$”。您需要在使用它们之前定义 spaceChar 和 tabChar,例如spaceChar=" ". 在这里您无法看到 tabChar,但并非所有 sed 都支持该\t版本。您可以选择按 Tab 键或使用\t. 我会选择tab键,因为它更便携。

虽然使用 , 可能可以实现您的目标,但它是bashsed此类问题而设计的。

我希望这有帮助。

于 2011-10-31T16:50:39.997 回答
0

尝试:

Part1=`echo $command | grep "Sink #0"`

代替

Part1=$(grep "Sink #0" $command);
于 2011-10-31T16:09:15.147 回答