2010-10-19 67 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