2017-09-28 15 views
0

処理テキスト - 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

おかげ

P.S.を抽出する必要があるかもしれません私の音楽プレーヤーの音量を上げたり下げたりするスクリプトが必要です。私はLinuxとbashの両方に全く新しいので、問題を解決する方法を見つけられませんでした。

編集: 私のawkのバージョン

[email protected]:~$ awk -W version 
mawk 1.3.3 Nov 1996, Copyright (C) Michael D. Brennan 

compiled limits: 
max NF    32767 
sprintf buffer  2040 
+0

あなたはこのコミュニティで検索した同様の質問から何を試みましたか?そのような例がたくさんあります。 – Inian

+0

私は過去数時間、グーグルでは成功していませんでした。私はあまりにも初心者で、このために未経験であるので、awk、grepそして他の人たちは私が理解するのが辛すぎる。申し訳ありませんが、似たような質問がたくさんありますが、これを解決する方法がまだ見つかりませんでした:c –

+1

Ok!だから質問のカップル。出力に複数の「Sink Input#67」が存在しますか? '30 'を抽出する必要がありますか? 'front-left'と' front-right'の両方の値が同じです – Inian

答えて

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}構文に基づいている時に1つの行を処理します。しかし、ここでは、/Sink Input #67/という行に一致し、フラグ(f)を有効にして、次の行のVolume:文字列を次にマークします。フラグが設定されていなければ、他のシンク入力のインスタンスと一致する可能性があります。

したがって、デリミタ/を使用して行を分割し、配列に格納されている2番目に一致する要素(matchGroup)を取得します。次に、gsub()の呼び出しを2回使用して先頭の空白を置き換え、その他を使用して数字の後の%記号を削除します。

関連する問題