Простой синтаксический анализ регулярных выражений в bash - PullRequest
3 голосов
/ 19 октября 2010

Я хочу проанализировать файл журнала (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.Я понятия не имею о программировании оболочки, поэтому подробный скрипт будет очень полезен, подойдут ссылки на справочник по программированию на bash.

Ответы [ 5 ]

5 голосов
/ 19 октября 2010

Вот решение 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<&-
2 голосов
/ 19 октября 2010

Это должно работать:

sed -n 's%^.* URL:\(.*\) \[[0-9]*\] -> .*$%<a href="\1">\1</a>%p' log.txt
2 голосов
/ 19 октября 2010

Вот небольшой скрипт на awk, который должен делать то, что вам нужно.

awk '/URL:/ { sub(/^URL:/,"", $3); printf "<a href=\"%s"\">%s</a>\n", $3, $3; }'
1 голос
/ 19 октября 2010

Примерно так:

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
1 голос
/ 19 октября 2010

А как насчет sed:

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

(Обратите внимание: вы можете адресовать часть URL более правильно, например, по длине строки даты перед ней, но мне было просто лень.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...