|
藍森林 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的所有精華貼,確實水平提高很多。 |
請教讀不規則文件的問題
謝謝!
努力學習中... |
| |