藍森林首頁 | 返回主頁 | 本站地圖 | 站內搜索 | 聯繫信箱 |
 您目前的位置:首頁 > 自由軟件 > 技術交流 > 應用編程


    

藍森林 http://www.lslnet.com 2006年6月26日 11:18


請教讀不規則文件的問題

我需要讀一個log文件,文件的格式大致這樣:
..
..
Thursday,03/31/2005,19:30; Expected Duration: 900 seconds
     Duration    Machine Call_Attempts Emergency_Call_Attempts
   ---------- ---------- ------------- -----------------------
          900          0         58375                       7
..
..
..
Thursday,03/31/2005,19:45; Expected Duration: 900 seconds
..
..
Calls_Routed Calls_Help_Desk Menu_Access_Attempts
   ------------ --------------- --------------------
          16073               0                  466              
..
..
..
      Thursday,03/31/2005,20:15; Expected Duration: 900 seconds
..
..
IP_Connection_Attempts IP_Connection_Failures
-- ---------------------- -------------------
                     3498                     31              
..
..
我需要分別根據Emergency_Call_Attempts,Calls_Routed,IP_Connection_Attempts 來定位文件,查找相應的Call_Attempts ,Calls_Routed,IP_Connection_Attempts 下面對應的值,以及每個值發生時的時間,保存到數據庫裡以供統計分析使用。
script我是新手,看了一些文檔,但不知道這樣的shell應該怎麼寫,是用whil循環還是用awk處理比較好?
謝謝各位!

請教讀不規則文件的問題

這不難,但不知道你要的最後文本是怎樣的,比如你的例子最後要的是這樣的嗎?
[code]
03/31/2005,19:30   Call_Attempts    58375
03/31/2005,19:45   Calls_Routed     16073
03/31/2005,20:15   IP_Connection_Attempts   3498
[/code]
說清楚別人才能知道

請教讀不規則文件的問題

對,如果能得到這樣的結果就可以了,我可以比較方便的進行統計、分析。
謝謝!

請教讀不規則文件的問題

如果真是完全不規則,那程序就沒辦法解析了。
這樣不太規則的文本,您必須把文本貼全了,供發現其規則之處,「..」是不行的,或者您需要僅解析所貼的這個文本?

請教讀不規則文件的問題

對啊,把你真實的文本貼出來。我都不知道你文本中的
..
行是你的省去的意思還是就是兩個點。。。

請教讀不規則文件的問題

不好意思,可能是我說得不夠清楚,
..是我省略的行,因為中間的行很多,內容又不需要知道,所以我用..省略
另外,這個log是循環使用的,大家可以看出來,其實它是每隔15分鐘或30分鐘寫一堆的信息,我現在需要把關心的內容提取出來。
thanks!

請教讀不規則文件的問題

你的第一種類型時間行和信息行是在一起,而後面的兩種類型卻中間隔了N行,就是這樣還是你的筆誤??不把文本貼出來講清楚這些細節是沒辦法寫的,shell就要根據這些細節才能寫,否則寫了可能你也不適用,僅此而已。。。
寫東西總要找一些規律,你說了一些毫無規律的信息等於沒說,既然讓別人幫你,就要盡可能的把問題說清楚講明白。

請教讀不規則文件的問題

是這樣,
第一種類型時間行和信息行是在一起,第二種和第三種中間確實有一些其他的信息,我之所以沒有完整貼出來,是因為中間的信息很多。但格式是固定的,行數也是固定的,li2002你可以認為 中間就是隔兩行。
感謝li2002的熱心。

請教讀不規則文件的問題

再頂一下

請教讀不規則文件的問題

我以下腳本是基於這樣的規律:
只有時間行一定有「Expected Duration」
信息行是連在一起的三行,其中中間一行是有「-------」組成,其他行沒有「--------」這樣的字符串。
時間行和信息行不一定連續。


[code]
cat w
..
..
Thursday,03/31/2005,19:30; Expected Duration: 900 seconds
Duration    Machine Call_Attempts Emergency_Call_Attempts
  ---------- ---------- ------------- -----------------------
         900          0         58375                       7
..
..
..
Thursday,03/31/2005,19:45; Expected Duration: 900 seconds
..
..
Calls_Routed Calls_Help_Desk Menu_Access_Attempts
  ------------ --------------- --------------------
         16073               0                  466
..
..
..
     Thursday,03/31/2005,20:15; Expected Duration: 900 seconds
..
..
IP_Connection_Attempts IP_Connection_Failures
-- ---------------------- -------------------
                    3498                     31
..
..



[/code]


[code]
sed -n -e :a -e '/Expected Duration/p;ta;/-----/{g;$!N;p};ta;h' w |sed 's/,/;/'|awk  '
   BEGIN{ s[1]="Call_Attempts" ;
          s[2]="Calls_Routed" ;
          s[3]="IP_Connection_Attempts" ;
    }
    {
    if($0~/Expected Duration/){
        split($0,a,";");
        getline;
        for(i=1;i<4;i++)if(index($0,s[i]))break;
        if(i<4){
            getline;
            split($0,b," ");
            if(i==1)b[1]=b[3];
            printf("%s  %s  %s\n",a[2],s[i],b[1]);
        }
     }
   }'
[/code]


結果:
[code]
03/31/2005,19:30  Call_Attempts  58375
03/31/2005,19:45  Calls_Routed  16073
03/31/2005,20:15  IP_Connection_Attempts  3498
[/code]

請教讀不規則文件的問題

剛剛執行了代碼,得到這樣的錯誤信息:
Label too long: /Expected Duration/p;ta;/-----/{g;$!N;p};ta;h
awk: syntax error near line 2
awk: bailing out near line 2
我的系統是
SunOS  5.9 sun4u sparc SUNW,Netra-440       

sed我不熟,awk用過簡單的命令,正在學習中...

請教讀不規則文件的問題

-->


sorry,我沒有sunOS,原來程序在linux下做的,沒有問題,可能是gsed的擴展在標準sed裡不好用,我在sco unix裡也出現那個too long的錯誤,應該lable是支持的,但不知道為什麼報錯,沒辦法,只好來個比較笨的方法
[code]
a0='Expected Duration'
a1='Call_Attempts'
a2='Calls_Routed'
a3='IP_Connection_Attempts'
a4='-----'
sed -n -e  "/$a0/p;/$a1/p;/$a2/p;/$a3/p;/$a4/{$!n;p;}" w|sed 's/,/;/'|awk   '
   BEGIN { s[1]="Call_Attempts";
           s[2]="Calls_Routed";
           s[3]="IP_Connection_Attempts";
   }
   {
   if($0~/Expected Duration/){
       split($0,a,";");
       getline;
       for(i=1;i<4;i++)if(index($0,s[i]))break;
       if(i<4){
           getline;
           split($0,b," ");
           if(i==1)b[1]=b[3];
           printf("%s  %s  %s\n",a[2],s[i],b[1]);
       }
    }
  }'
[/code]

結果[code]
03/31/2005,19:30  Call_Attempts  58375
03/31/2005,19:45  Calls_Routed  16073
03/31/2005,20:15  IP_Connection_Attempts  3498
[/code]

我在sco 506中調試通過,應該在sun中也可以吧。

請教讀不規則文件的問題

謝謝!
現在sed沒有問題了,但awk仍有錯誤信息:
awk: syntax error near line 2
awk: bailing out near line 2
另外,我這樣改寫sed(做個測試):
a0='Expected Duration'
a1='Call_Attempts'  
a2='Calls_Routed'
a3='IP_Connection_Attempts'
a4='-----'
sed -n -e  "
/$a0/p;/$a1/{$!p;n;p;n;p;};/$a2/p;/$a3/p;/$a4/{$!n;p;}" $1|sed 's/,/;/'
為什麼a0,a1的能輸出,a2,a3,a4就沒有輸出呢?

請教讀不規則文件的問題

用nawk或gawk試試,或者你awk中那裡格式有問題。

請教讀不規則文件的問題

改成nawk後沒問題了!
我哪樣改一下有什麼問題?我是想把a1及其下面兩行一起輸出。

請教讀不規則文件的問題

另外,哪有sed和awk的詳細文檔?man出來看得不是很明白...

請教讀不規則文件的問題

你這樣中間要斷口
-e  "
/$a0/p;/$a1/{$!p;n;p;n;p;}" -e "/$a2/p;/$a3/p;/$a4/{$!n;p;}"

請教讀不規則文件的問題

文檔論壇裡有,精華貼中有awk的完整文檔,sed好像沒有完整文檔,但有很多對各種命令介紹的帖子,也都非常好,最近我剛看完shell的所有精華貼,確實水平提高很多。

請教讀不規則文件的問題

謝謝!
努力學習中...



Copyright © 1999-2000 LSLNET.COM. All rights reserved. 藍森林網站 版權所有。 E-mail : webmaster@lslnet.com