代码之家  ›  专栏  ›  技术社区  ›  Salman Arshad

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

  •  3
  • Salman Arshad  · 技术社区  · 14 年前

    我要分析一个日志文件(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 回复  |  直到 14 年前
        1
  •  2
  •   mouviciel    14 年前

    这应该有效:

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

    #!/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<&-
    
        3
  •  2
  •   a'r    14 年前

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

    awk '/URL:/ { sub(/^URL:/,"", $3); printf "<a href=\"%s"\">%s</a>\n", $3, $3; }'
    
        4
  •  1
  •   Zsolt Botykai    14 年前

    SeD:

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

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

        5
  •  1
  •   codaddict    14 年前

    像这样:

    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