Bash Script循环遍历MySQL行并使用curl和grep

时间:2014-03-05 20:48:31

标签: mysql bash shell curl

我有一个mysql数据库,带有一个表: 网址|字

数据就像,例如:

------Column URL-------   -------Column Words------

www.firstwebsite.com    |   hello, hi

www.secondwebsite.com   |   someword, someotherword

我想循环遍历该表格,以检查该字词是否存在于网址指定的网站内容中。

我有这样的事情:

!/bin/bash

mysql --user=USERNAME --password=PASSWORD DATABASE --skip-column-names -e "SELECT url, keyword FROM things" | while read url keyword; do
    content=$(curl -sL $url)
    echo $content | egrep -q $keyword
    status=$?

    if test $status -eq 0 ; then
        # Found...
    else
        # Not found...
    fi
done

一个问题:

速度非常慢:如何设置curl来优化每个网站的加载时间,不加载图像,这样的事情?

另外,将这样的东西放在shell脚本中是个好主意,还是创建一个php脚本更好,并用curl调用它?

谢谢!

1 个答案:

答案 0 :(得分:0)

目前,如果您的示例中每行有多个关键字,那么您的脚本将无法正常工作。原因是当你将hello, hi传递给egrep时,它将在其输入中查找确切的字符串“hello,hi”, not 中的“hello”或“hi” ”。您可以通过将每个关键字列表转换为egrep兼容的正则表达式sed来修改此问题,而无需更改数据库中的内容。您还需要从|的输出中删除mysql,例如awk

下载网页的HTML时,

curl无法检索图像。如果查询URL的顺序对您无关紧要,那么您可以通过使整个事件与&异步来加快速度。

#!/bin/bash

handle_url() {
    if curl -sL "$1" | egrep -q "$2"; then
        echo 1 # Found...
    else
        echo 0 # Not found...
    fi
}

mysql --user=USERNAME --password=PASSWORD DATABASE --skip-column-names -e "SELECT url, keyword FROM things" | awk -F \| '{ print $1, $2 }' | while read url keywords; do
    keywords=$(echo $keywords | sed -e 's/, /|/g;s/^/(/;s/$/)/;')
    handle_url "$url" "$keywords" &
done