3

「tail」出力をフィルタリングする bash スクリプトを作成しました。これは、コマンド全体です。

 tail -f /var/log/asterisk/messages | awk 'match($12, /[^0-9]91([0-9]{10})@default/, a) {print a[1]}'

CLI からは正常に機能しますが、bash スクリプトに配置すると機能しません。

 #!/bin/bash

 phonenumber=$(tail -f /var/log/asterisk/messages | awk 'match($12, /[^0-9]91([0-9]{10})@default/, a) {print a[1]}')
 echo "$phonenumber >> test.log"

何も出力しません (2135551234 は、予想される出力文字列です) ログ ファイルに書き込み、stdout だけを書き込もうとしましたが、どちらも機能しません。

「tail」の代わりに「cat」を使用してスクリプトを試してみましたが、問題なく動作します。しかし、ファイル全体の出力をダンプしたくないので、「テール」を使用します。

「tee」も使用してみましたが、役に立ちませんでした

このスクリプトの最終目標は、PBX に入ってきた電話番号を別のシステムのシリアル デバイスに送信し、CID として使用することです。

事前にご協力いただきありがとうございます

4

1 に答える 1

4

これを試して:

phonenumber=$(tail -f /var/log/asterisk/messages | awk 'match($12, /[^0-9]91([0-9]{10})@default/, a) {print a[1]; exit}')

tail -fawkが無限ループに陥っているため、このバージョンは機能しません。スクリプトに追加exitするとawk、最初の電話番号が見つかったときにループが終了します。awkすぐに終了し、その出力は変数に入れられtail -f、次の行をパイプに書き込もうとすると SIGPIPE シグナルを受け取ります。これにより終了します。

于 2013-07-19T16:50:52.837 に答える