Обработка текста в 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
Другие вопросы по тегам