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

注: 複数のシンク入力がある可能性があり、ボリュームを抽出する必要があるのはシンク入力 #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 AwkI have installed を使用してこの回答を基にしています。これ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}構文に基づいて一度に 1 行ずつ処理します。ただし、この例では、行を照合し/Sink Input #67/、flag( ) を有効にして、以下の行で string がf次に出現することをマークします。Volume:フラグが設定されていないと、他のシンク入力のインスタンスと一致する可能性があります。

行を一致させたら、区切り文字を使用して行を分割/し、array( matchGroup) に格納されている 2 番目に一致した要素を取得します。次に、gsub()呼び出しを 2 回使用して、先頭の空白を置き換え、%数字の後の記号を削除します。

于 2017-09-28T16:24:37.397 に答える