处理bash中的文本 - 从pactl sink-inputs输出中提取程序的音量

时间:2017-09-28 15:31:56

标签: linux bash awk mawk

寻找从

中提取音量的方法
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

注意:可能有多个接收器输入,我只需从接收器输入#67提取音量

由于

P.S。需要这个我的剧本,这应该增加或减少我的音乐播放器的音量。我对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

1 个答案:

答案 0 :(得分: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/并启用标记(f)以标记下一行中下一个出现的Volume:字符串。如果没有设置标志,它可以匹配其他接收器输入的实例。

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