如何将这个复杂的命令行grep语句的结果推送到mysql数据库?

时间:2014-05-24 22:31:12

标签: mysql bash grep httrack

此代码搜索网站html文件并提取域名列表...

httrack --skeleton http://www.ilovefreestuff.com -V "cat \$0" | grep -iEo '[[:alnum:]-]+\.(com|net|org)'

结果如下所示。

  • domain1.com
  • domain2.com
  • domain3.com

我计划在非常大的网站上使用此代码,因此这将生成一个非常大的域名列表。此外,上面的代码生成了许多重复的域名。因此,我设置了一个具有唯一字段的mysql数据库,因此不会插入重复项。

利用我有限的编程知识,我在下面将这一行一起攻击,但这不起作用。当我执行命令时,我没有得到任何错误,只是一个新的命令提示符>和一个闪烁的光标。我假设我没有使用正确的语法或方法,和/或可能通过命令行无法实现我想做的事情。非常感谢任何帮助。

httrack --skeleton http://www.ilovefreestuff.com -V "cat \$0" | domain=“$(grep -iEo '[[:alnum:]-]+\.(com|net|org)’)” | mysql -pPASSWORD -e "INSERT INTO domains.domains (domains) VALUES ($domain)”

是的,我的数据库名称是域名,我的表名是域名,我的字段名称是域名。

1 个答案:

答案 0 :(得分:0)

INSERT的MySQL语法判断:

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name
    [PARTITION (partition_name,…)] 
    [(col_name,…)]
    {VALUES | VALUE} ({expr | DEFAULT},…),(…),…
    …

您需要将域名转换为带括号,带引号,逗号分隔的项目:

('domain1.com'),('domain2.com'),…

然后将此列表附加到您生成的INSERT语句的末尾。

httrack --skeleton http://www.ilovefreestuff.com -V "cat \$0" |
grep -iEo '[[:alnum:]-]+\.(com|net|org)’ |
sort -u |
sed -e "s/.*/,('&')/" -e '1s/,/INSERT IGNORE INTO domains.domains(domain) VALUES /' |
mysql -pPASSWORD

sort -u确保名称是唯一的。第一个-esed会将一行(例如domain1.com)的内容转换为,('domain1.com);第二个-e删除第一行的逗号(由第一个-e添加),并将其替换为INSERT前缀。 IGNORE语句中的INSERT表示如果某个域已经在表中,则新条目将被忽略。

显然,如果生成的域数对于MySQL中的有效SQL语句来说太大,那么您必须对数据进行一些拆分,但是您很可能能够处理一些一次千个域名。