2010-10-19 110 views
3

解析我想分析其中包含類似以下行的日誌文件(log.txt的):簡單的正則表達式在bash

2010-10-19 07:56:14 URL:http://www.website.com/page.php?ID=26 [13676] -> "www.website.com/page.php?ID=26" [1] 
2010-10-19 07:56:14 URL:http://www.website.com/page.php?ID=44 [14152] -> "www.website.com/page.php?ID=44" [1] 
2010-10-19 07:56:14 URL:http://www.website.com/page.php?ID=13 [13681] -> "www.website.com/page.php?ID=13" [1] 
2010-10-19 07:56:14 ERROR:Something bad happened 
2010-10-19 07:56:14 ERROR:Something really bad happened 
2010-10-19 07:56:15 URL:http://www.website.com/page.php?ID=14 [12627] -> "www.website.com/page.php?ID=14" [1] 
2010-10-19 07:56:14 ERROR:Page not found 
2010-10-19 07:56:15 URL:http://www.website.com/page.php?ID=29 [13694] -> "www.website.com/page.php?ID=29" [1] 

正如你可能已經猜到了:

1)我需要從每一行中提取該部分:

2010-10-19 07:56:15 URL:http://www.website.com/page.php?ID=29 [13694] -> "www.website.com/page.php?ID=29" [1] 
------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

2)該部分轉到另一個文件(log.html)所示:

<a href="http://www.website.com/page.php?ID=29">http://www.website.com/page.php?ID=29</a> 

我需要通過bash腳本來執行此操作,該腳本將在* nix平臺上運行。我不知道shell編程如此詳細的腳本將會非常感謝,指向bash編程參考的指針會做。

+1

猛砸沒有做正則表達式。使用grep找到匹配的行,然後awk提取相關的位。 – 2010-10-19 12:14:47

回答

2

這應該工作:

sed -n 's%^.* URL:\(.*\) \[[0-9]*\] -> .*$%<a href="\1">\1</a>%p' log.txt 
+0

你真的*在圓括號前需要反斜槓嗎? – 2010-10-19 13:05:51

+0

有了'sed',是的,我有。 – mouviciel 2010-10-19 13:27:41

+0

我用反斜槓和引號引起了糟糕的時間,但最終得到了這個工作: sed -n「s @。\ + URL:\\([^] \ + \\)。+ @ @ @ 1 @ p」 log.txt | sed's @ @ @ @ & @「> url.txt – 2010-10-19 15:45:36

2

這裏有一個小awk腳本,應該做你需要的。

awk '/URL:/ { sub(/^URL:/,"", $3); printf "<a href=\"%s"\">%s</a>\n", $3, $3; }' 
1

怎麼樣的sed:

sed -n 's/.*URL:\([^ ]\+\) .*/<a href="\1">\1<\/a>/;/<a href/p' logfile 

(請注意:您可以更妥善處理URL的一部分,例如,通過日期字符串的長度在它的前面,但我只是懶惰。)

5

這裏是一個bash解決方案

#!/bin/bash 
exec 4<"log.txt" 
while read -r line<&4 
do 
    case "$line" in 
    *URL:*) 
     url="${line#*URL:}" 
     url=${url%% [*} 
     echo "<a href=\"${url}\">${url}</a>" 
    esac 
done 
exec 4<&- 
1

事情是這樣的:

while read line 
do 
     URL=$(echo $line | egrep -o 'URL:[^ ]+' | sed 's/^URL://')  
     if [ -n "$URL" ]; then 
       echo "<a href=\"$URL\">$URL</a>" >> output.txt 
     fi 
done < input.txt 
+0

使用'egrep'讀取文件比外部循環更快。 'egrep -o'URL:[^] +'input.txt | sed ..... |閱讀....'。順便說一句,'egrep'現在是'grep -E'。 – ghostdog74 2010-10-19 12:40:32

+0

@ ghostdog74:感謝'egrep'提示。但沒有得到第一部分。 – codaddict 2010-10-19 12:45:34

+1

您有一個外部while循環讀取文件,每行使用管道調用2個外部命令'egrep'和'sed'。這是昂貴的操作。因此,建議使用'egrep'來迭代文件,因爲它的優化可以更高效地覆蓋大小文件。不,你的腳本沒有錯,只是在速度方面沒有優化,就這些。 :) – ghostdog74 2010-10-19 12:51:05