0

アスタリスクが独自の通話ログをcsvファイルの形式で作成することを知っています。私の目的のために、以下に示すようにフォーマットされた通話ログが必要です。私が使う:

ls -l /var/spool/asterisk/monitorこれを生成する私の通話ログの基礎として:

-rw------- 1 asterisk asterisk  112684 2013-02-07 17:24 20130207-172424-+15551235566-IN.wav
-rw------- 1 asterisk asterisk      44 2013-02-07 17:53 20130207-175311-+15554561122-IN.wav
-rw------- 1 asterisk asterisk 2019564 2013-02-07 18:00 20130207-175828-15554561122-OUT.wav
-rw------- 1 asterisk asterisk      44 2013-02-07 22:09 20130207-220805-15554561122-OUT.wav
-rw------- 1 asterisk asterisk      44 2013-02-07 22:12 20130207-221204-15551235566-OUT.wav
-rw------- 1 asterisk asterisk  111084 2013-02-07 22:13 20130207-221255-15551235566-OUT.wav
-rw------- 1 asterisk asterisk  364844 2013-02-07 22:39 20130207-223843-15558271212-OUT.wav
-rw------- 1 asterisk asterisk 4279404 2013-02-07 23:53 20130207-234836-5552785454-OUT.wav
-rw------- 1 asterisk asterisk      44 2013-02-08 00:00 20130208-000026-+15559813232-IN.wav

助けが必要な部分は、以下のコマンドです。それは機能し、私が望む正確な結果を生成します。しかし、私にはかさばるようです。短縮できますか?

変数

YESTER=$(date -d "-24 hours" +"%Y-%m-%d-%H%M")
TODAY=$(date +"%Y-%m-%d-%H%M_UTC")

通話履歴の作成 (変更したいコマンド)

ls -l /var/spool/asterisk/monitor/ |grep '\.wav'|awk '{print $8 " " $5/1000000}'|sed -e 's/4\.4e\-05/NOT RECORDED/g' -e 's/\.wav//g' -e 's/-/ /g' -e 's/OUT/OUT - Approx Minutes:/g' -e 's/IN/IN - Approx Minutes:/g' -e 's/\(\.[0-9]\).*$/\1/g' -e 's/^.\{15\}/& UTC -/' -e 's/^.\{13\}/&:/' -e 's/^.\{11\}/&:/' -e 's/^.\{6\}/&-/' -e 's/^.\{4\}/& /' -e 's/+//g' > /var/spool/asterisk/monitor/call_logs/${YESTER}__${TODAY}-call-log.txt

読みやすくするために、行で区切られたコマンドを次に示します ( | なし):

ls -l /var/spool/asterisk/monitor/
grep '\.wav'
awk '{print $8 " " $5/1000000}'
sed -e 's/4\.4e\-05/NOT RECORDED/g' 
-e 's/\.wav//g' 
-e 's/-/ /g' 
-e 's/OUT/OUT - Approx Minutes:/g'
-e 's/IN/IN - Approx Minutes:/g' 
-e 's/\(\.[0-9]\).*$/\1/g' 
-e 's/^.\{15\}/& UTC -/' 
-e 's/^.\{13\}/&:/' 
-e 's/^.\{11\}/&:/' 
-e 's/^.\{6\}/&-/' 
-e 's/^.\{4\}/& /' 
-e 's/+//g' 
> /var/spool/asterisk/monitor/call_logs/${YESTER}__${TODAY}-call-log.txt

出力:

2013 02-07 17:24:24 UTC - 15551235566 IN - Approx Minutes: 0.1
2013 02-07 17:53:11 UTC - 15554561122 IN - Approx Minutes: NOT RECORDED
2013 02-07 17:58:28 UTC - 15554561122 OUT - Approx Minutes: 2.0
2013 02-07 22:08:05 UTC - 15554561122 OUT - Approx Minutes: NOT RECORDED
2013 02-07 22:12:04 UTC - 15551235566 OUT - Approx Minutes: NOT RECORDED
2013 02-07 22:12:55 UTC - 15551235566 OUT - Approx Minutes: 0.1
2013 02-07 22:38:43 UTC - 15558271212 OUT - Approx Minutes: 0.3
2013 02-07 23:48:36 UTC - 5552785454 OUT - Approx Minutes: 4.2
2013 02-08 00:00:26 UTC - 15559813232 IN - Approx Minutes: NOT RECORDED
4

3 に答える 3

0

すべてのフォーマットを AWK に入れることができますが、なぜ sed を使用するのですか?

簡単にするには、使用します

[root@gleb monitor]# ls -l --time-style="+%Y-%m-%d %H:%M -"
-rw-r--r-- 1 asterisk asterisk    5195 2013-01-09 21:42 - 20130109-214242-1357756962.1658.WAV
-rw-r--r-- 1 asterisk asterisk   13450 2013-01-13 22:33 - 20130113-223350-1358105630.4124.WAV

残念ながら、他のファイルがあるため、完全なスクリプトを提供することはできません。このような ls コマンドの出力に基づいて、データを書き換える必要がなくなったため、列として使用できます。単一の awk 式でフォーマットを含むフル機能の処理を行うことができます。 http://www.gnu.org/software/gawk/manual/html_node/Printf-Examples.html

于 2013-02-08T03:13:50.937 に答える
0
$ cat tst.awk
{
   mins = $5 / 1000000
   mins = ( mins == "4.4e-05" ? "NOT RECORDED" : sprintf("%.1f",mins) )

   split($8,fname,/-\+?|\./)
   date = fname[1]
   time = fname[2]
   nrs  = fname[3]
   dir  = fname[4]

   printf "%s %s-%s ",substr(date,1,4),substr(date,5,2),substr(date,7,2)
   printf "%s:%s:%s UTC - ",substr(time,1,2),substr(time,3,2),substr(time,5,2)
   printf "%s %s - Approx Minutes: %s\n",nrs,dir,mins
}

$ awk -f tst.awk file
2013 02-07 17:24:24 UTC - 15551235566 IN - Approx Minutes: 0.1
2013 02-07 17:53:11 UTC - 15554561122 IN - Approx Minutes: NOT RECORDED
2013 02-07 17:58:28 UTC - 15554561122 OUT - Approx Minutes: 2.0
2013 02-07 22:08:05 UTC - 15554561122 OUT - Approx Minutes: NOT RECORDED
2013 02-07 22:12:04 UTC - 15551235566 OUT - Approx Minutes: NOT RECORDED
2013 02-07 22:12:55 UTC - 15551235566 OUT - Approx Minutes: 0.1
2013 02-07 22:38:43 UTC - 15558271212 OUT - Approx Minutes: 0.4
2013 02-07 23:48:36 UTC - 5552785454 OUT - Approx Minutes: 4.3
2013 02-08 00:00:26 UTC - 15559813232 IN - Approx Minutes: NOT RECORDED

だからただやってください:

ls -l /var/spool/asterisk/monitor/*.wav | awk -f tst.awk
于 2013-02-09T23:48:40.010 に答える
0

あなたの場合は可能ですが、一般的には解析lsを避けるべきです。find代わりに使用するソリューションを見たいと思います。にアクセスできる場合はGNU awk、パイプラインを大幅に簡素化できます。次のように実行します。

awk -f script.awk <(find /var/spool/asterisk/monitor/ -maxdepth 1 -type f -name "*.wav" -printf "%p %s\n" | sort -n)

の内容script.awk:

BEGIN {
    t = systime()
    y = t - 60 * 60 * 24

    t = strftime("%Y-%m-%d-%H%M_UTC", t)
    y = strftime("%Y-%m-%d-%H%M", y)
}

{
    p = "^..(....)(..)(..)-(..)(..)(..)-\\+?([^-]*)-([^\\.]*).*$"
    r = "\\1 \\2-\\3 \\4:\\5:\\6 UTC - \\7 \\8 - Approx Minutes:"

    s = ($2 != 44 ? sprintf("%.1f", $2/1000000) : "NOT RECORDED")

    print gensub(p, r, "", $1) FS s > y "__" t "-call-log.txt"
}

私のテストでは、これにより、目的の出力を含む単一のログ ファイルが生成されます。現在は を使用しているためfind、ファイル名に空白または改行文字が含まれている場合は、メソッドを簡単に変更できます。それがどうなるか教えてください。乾杯。

于 2013-02-10T03:07:18.663 に答える