Обработка текста в bash - извлечение объема программы из вывода входных сигналов pactl
Ищете способ извлечь объем из
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
Спасибо
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
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()
вызывает дважды один раз, чтобы заменить ведущие пробелы и другие, чтобы удалить %
знак после номера.
Этот сценарий, который я написал, может быть тем, что вы хотели. Это позволяет мне легко регулировать громкость с помощью
pacmd
а также
pactl
команды. Кажется, работает хорошо, когда я использую рабочий стол GNOME (Wayland или Xorg), и до сих пор он работает на RHEL/Fedora и Ubuntu. Я не пробовал использовать его с другими рабочими столами/дистрибутивами, с системами объемного звучания и т. д.
Перетащите его на свой путь и запустите без каких-либо значений, чтобы увидеть текущий том. В качестве альтернативы установите громкость, передав ее в процентах. Одно значение задает оба динамика, два значения задают отдельно левый и правый. Теоретически вы не должны использовать значение за пределами 0%-200%, но скрипт не проверяет это (и, по-видимому, PulseAudio тоже), поэтому будьте осторожны, так как громкость выше 200% может повредить ваши динамики.
[~]# volume
L R
20% 20%
[~]# volume 100% 50%
[~]# volume
L R
100% 50%
[~]# volume 80%
[~]# volume
L R
80% 80%
#!/bin/bash
[ ! -z "$1" ] && [ $# -eq 1 ] && export LVOL="$1" && export RVOL="$1"
[ ! -z "$1" ] && [ ! -z "$2" ] && [ $# -eq 2 ] && export LVOL="$1" && export RVOL="$2"
SINK=$(pacmd list-sinks | grep -e '* index:' | grep -Eo "[0-9]*$")
if [ -z "$LVOL" ] || [ -z "$RVOL" ]; then
# pacmd list-sinks | grep -e '* index:' -A 20 | grep -e 'name:' -e '^\s*volume:.*\n' -e 'balance' --color=none
printf "%-5s%-4s\n%-5s%-4s\n" "L" "R" $(pacmd list-sinks | grep -e '* index:' -A 20 | grep -e '^\s*volume:.*\n' --color=none | grep -Eo "[0-9]*%" | tr "\n" " " | sed "s/ $/\n/g")
exit 0
elif [[ ! "$LVOL" =~ ^[0-9]*%$ ]] || [[ ! "$RVOL" =~ ^[0-9]*%$ ]]; then
printf "The volume should specified as a percentage, from 0%% to 200%%.\n"
exit 1
elif [ "$SINK" == "" ]; then
printf "Unable to find the default sound output.\n"
exit 1
fi
pactl -- set-sink-volume $SINK $LVOL $RVOL