正規表現が一致するたびにコマンドを実行し、EOFなしでstdinから読み込みます。

正規表現が一致するたびにコマンドを実行し、EOFなしでstdinから読み込みます。

dbus-monitorの出力で特定の文字列が見つかるたびにタイムスタンプ(ファイルに書き込まれる)を生成するBASHスクリプトを作成しようとしています(パラメータは後で指定します)。私のスクリプトの主な目的は、通知を使用するため、Spotifyで曲が再生され始める時間(ミリ秒を含む)と日付を節約することです。

string "Spotify"曲が再生されるたびに、次のコマンドが出力されます。

dbus-monitor --session interface='org.freedesktop.Notifications',member='Notify' | grep 'string "Spotify"'

私の試み:

search='string "Spotify"'
found=$(dbus-monitor --session interface='org.freedesktop.Notifications',member='Notify' | grep 'string "Spotify"')

while [ ${search} == ${found} ]; do
    date -u +%Y%M%d-%H%M%S.%N >> timestamp.txt
done

コード機能障害の原因は、dbus-monitor が引き続き実行され、while ループの実行をブロックするためであると仮定します。

ベストアンサー1

awk代わりに使用してくださいgrep。次のようになります。

dbus-monitor ... | awk '/Spotify/ {
    system("date -u +%Y%m%d-%H%M%S.%N >> timestamp.txt")
  }'

(月以外の間、-Mの%Y%m%d代わりに大文字Mが使用されます。CAPS-Dは同じです。)%Y%M%D%m/%d/%y

これは、入力に「Spotify」が表示されるたびに、awkのsystem()機能を使用してサブシェルでdateコマンドを実行します。または、awkに組み込まれている日付形式とリダイレクトを使用してください。

dbus-monitor ... | awk '/Spotify/ {
    print strftime("%Y%m%d-%H%M%S") >> "timestamp.txt"
  }'

strftime()このバージョンはサポートされていないため、タイムスタンプにナノ秒を印刷しません%N

または、awkの代わりにperlを使用してください。これによりPerlを使用できます。デスクトップ::通知通知を受け取るためのモジュールまたはネットワーク::DBusdbusと直接通信してください。

おすすめ記事