0

寻找一种方法来提取音量

pactl list sink-inputs

输出示例:

Sink Input #67
        Driver: protocol-native.c
        Owner Module: 12
        Client: 32
        Sink: 0
        Sample Specification: s16le 2ch 44100Hz
        Channel Map: front-left,front-right
        Format: pcm, format.sample_format = "\"s16le\""  format.channels = "2"  format.rate = "44100"  format.channel_map = "\"front-left,front-right\""
        Corked: no
        Mute: no
        Volume: front-left: 19661 /  30% / -31.37 dB,   front-right: 19661 /  30% / -31.37 dB
                balance 0.00
        Buffer Latency: 100544 usec
        Sink Latency: 58938 usec
        Resample method: n/a
        Properties:
                media.name = "'Alerion' by 'Asking Alexandria'"
                application.name = "Clementine"
                native-protocol.peer = "UNIX socket client"
                native-protocol.version = "32"
                media.role = "music"
                application.process.id = "16924"
                application.process.user = "gray"
                application.process.host = "gray-kubuntu"
                application.process.binary = "clementine"
                application.language = "en_US.UTF-8"
                window.x11.display = ":0"
                application.process.machine_id = "54f542f950a5492c9c335804e1418e5c"
                application.process.session_id = "3"
                application.icon_name = "clementine"
                module-stream-restore.id = "sink-input-by-media-role:music"
                media.title = "Alerion"
                media.artist = "Asking Alexandria"                           

我想提取

30

从线

 Volume: front-left: 19661 /  30% / -31.37 dB,   front-right: 19661 /  30% / -31.37 dB

注意:可能有多个 sink 输入,我只需要从 Sink Input #67 中提取音量

谢谢

PS 我的脚本需要这个,它应该增加或减少我的音乐播放器的音量。我对 linux 和 bash 都是全新的,所以我想不出解决问题的方法。

编辑:我的 awk 版本

gray@gray-kubuntu:~$ awk -W version
mawk 1.3.3 Nov 1996, Copyright (C) Michael D. Brennan

compiled limits:
max NF             32767
sprintf buffer      2040
4

1 回答 1

2

由于您是使用标准文本处理工具的新手,因此我将提供详细解释的答案。随意使用它以供将来使用。

我使用GNU Awk我已经安装的这个答案作为这个答案的基础,它应该也可以mawk安装在你的系统中。

pactl list sink-inputs | \
    mawk '/Sink Input #67/{f=1; next} f && /Volume:/{ n=split($0,matchGroup,"/"); val=matchGroup[2]; gsub(/^[[:space:]]+/,"",val); gsub(/%/,"",val); print val; f=0}'

Awk基于/pattern/{action1; action2}语法一次处理一行。不过,在我们的例子中,我们匹配该行/Sink Input #67/并启用一个 flag( f) 来标记下一Volume:行中字符串的下一次出现。如果没有设置标志,它可以匹配其他接收器输入的实例。

因此,一旦我们匹配了行,我们使用分隔符分割行/并获得存储在数组(matchGroup)中的第二个匹配元素。然后我们使用gsub()两次调用一次,以替换前导空格和其他以删除%数字后的符号。

于 2017-09-28T16:24:37.397 回答