2

私がやっているとき、私はpactl listたくさんの情報を手に入れます。それらの情報から、私はそのセクションの終わりまでシンク#0で始まる部分だけを取得しようとしています。

1)情報

Sink #0
    State: SUSPENDED
    Name: auto_null
    Description: Dummy Output
    Driver: module-null-sink.c
    Sample Specification: s16le 2ch 44100Hz
    Channel Map: front-left,front-right
    Owner Module: 14
    Mute: no
    Volume: 0:   0% 1:   0%
            0: -inf dB 1: -inf dB
            balance 0.00
    Base Volume: 100%
                 0.00 dB
    Monitor Source: auto_null.monitor
    Latency: 0 usec, configured 0 usec
    Flags: DECIBEL_VOLUME LATENCY 
    Properties:
        device.description = "Dummy Output"
        device.class = "abstract"
        device.icon_name = "audio-card"

Source #0
    State: SUSPENDED
    Name: auto_null.monitor
    Description: Monitor of Dummy Output
    Driver: module-null-sink.c
    Sample Specification: s16le 2ch 44100Hz
    Channel Map: front-left,front-right
    Owner Module: 14
    Mute: no
    Volume: 0:  80% 1:  80%
            0: -5.81 dB 1: -5.81 dB
            balance 0.00
    Base Volume: 100%
                 0.00 dB
    Monitor of Sink: auto_null
    Latency: 0 usec, configured 0 usec
    Flags: DECIBEL_VOLUME LATENCY 
    Properties:
        device.description = "Monitor of Dummy Output"
        device.class = "monitor"
        device.icon_name = "audio-input-microphone"

2)私は次のようにしようとしています:

#!/bin/bash
command=$(pactl list);
# just get Sink #0 section not one line 
Part1=$(grep "Sink #0" $command);
for i in $Part1
do
  # show only Sink #0 lines 
  echo $i;
done

3)非常に奇妙な出力

grep: dB: No such file or directory

BASHスクリプトを使用してそのセクションを取得するにはどうすればよいですか?そのようなフィルタリングに取り組む他の最良の方法はありますか?

フォローアップ:だから私もそれをシンプルにしようとしていました。そのような:

pactl list | grep Volume | head -n1 | cut -d' ' -f2- | tr -d ' '
|________|   |________|    |______|   |_____________|  |_________|
  |            |                |              |           |
  command     target get    show 1 row      cut empty      Dont know..
  to list 
4

2 に答える 2

2

エディターのいくつかの機能を使用してsed、目標を達成できます。

 sed -n '/^Sink/,/^$/p'  pactl_Output.txt

-n「出力の各行を印刷する標準オプションを実行しないでください

/^Sink/,/^$/ は範囲の通常のexprです。つまり、Sinkで始まる行を見つけてから、空の行()が見つかるまで行を調べ続けます/^$/

最後の文字は、p一致したものを印刷すると言います。

空の行にスペースまたはタブがある場合は、を使用します" ...,/^$[${spaceChar}${tabChar}]*\$/p"。変数${spaceChar}と${tabChar}を実際の値に拡張できるようにする単一引用符からdbl引用符への変更に注意してください。末尾の「$」をエスケープする必要がある場合があります。のように、使用する前にspaceCharとtabCharを定義する必要がありますspaceChar=" "。ここでは、tabCharを表示する方法はありませんが、すべてのsedがこの\tバージョンをサポートしているわけではありません。Tabキーを押すか、を使用するかを選択できます\t。持ち運びに便利なタブキーを使用します。

で目標を達成することはおそらく可能ですがbashsedこの種の問題のために設計されました。

これがお役に立てば幸いです。

于 2011-10-31T16:50:39.997 に答える
0

試す:

Part1=`echo $command | grep "Sink #0"`

それ以外の

Part1=$(grep "Sink #0" $command);
于 2011-10-31T16:09:15.147 に答える