在bash中简单的正则表达式解析

时间:2010-10-19 12:06:50

标签: linux bash scripting shell

我想解析一个包含与以下行类似的行的日志文件(log.txt):

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编程参考的指针将会做。

5 个答案:

答案 0 :(得分: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 :(得分:2)

这是一个小awk脚本,应该做你需要的。

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

答案 2 :(得分:2)

这应该有效:

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

答案 3 :(得分:1)

sed:

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

(请注意:您可以更正确地处理URL部分,例如,通过前面的日期字符串的长度,但我只是懒惰。)

答案 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