2013-02-08 2 views
0

별표는 csv 파일의 형태로 자체 호출 로그를 생성합니다. 내 목적에 따라 아래에 묘사 된대로 통화 기록을 형식화해야합니다. 내가 사용sed 명령 줄이기 - 별표 호출 로그를 만들 때 사용합니다.

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 

내가 도움이 필요한 부분이 아래에있는 내 명령입니다. 그것은 작동하고 내가 원하는 정확한 결과를 생산; 그러나, 그것은 나에게 부피가 보인다. 단축 될 수 있습니까?

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 
: |

변수

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

통화 기록 (I가 변경하려면 명령)을 생성

여기 쉽게 읽을

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 

답변

0

AWK에 모든 형식을 지정할 수 있습니다. 왜 sed를 사용합니까?

은 간단, 내가 다른 파일이 becuase 내가, 전체 스크립트를 줄 수

[[email protected] 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 

Unfortanly을 사용 얻었다합니다. 그런 ls 명령 출력을 기반으로 데이터를 다시 쓸 필요가 없으므로이를 열로 사용할 수 있습니다. 단일 awk 식으로 포매팅하는 것을 포함하여 전체 피처 처리를 수행 할 수 있습니다. http://www.gnu.org/software/gawk/manual/html_node/Printf-Examples.html

+0

나는 sed에 대해 더 잘 알고 있지만, AWK로 더 깨끗한 경우에는 제안 사항이 있습니다. – errorcode

+0

하지만 awk는 올바른 형식으로 인쇄 할 수 있습니다. 단일 printf 호출. – arheops

+0

위대한 작품, 감사합니다! – errorcode

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 
0

귀하의 경우 가능하지만, 당신은 일반적으로 parsing ls을 피해야한다. 대신 find을 사용하는 솔루션을 선호합니다. GNU awk에 액세스 할 수 있으면 파이프 라인을 상당히 단순화 할 수 있습니다. script.awk

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

내용 :처럼 실행 내 테스트에서

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을 사용하고 있기 때문에 파일 이름에 공백이나 개행 문자가 포함되어 있으면이 메서드를 쉽게 수정할 수 있습니다. 어떻게 진행되는지 알려주세요. 건배.