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

标签 mysql bash grep httrack

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

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

结果如下所示。

  • 域名1.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)”

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

最佳答案

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 前缀。 INSERT 语句中的 IGNORE 表示如果表中已存在域,则新条目将被忽略。

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

关于mysql - 如何将这个复杂的命令行 grep 语句的结果推送到 mysql 数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23850269/

相关文章:

mysql - Ruby gem 加载失败 - 无法加载驱动程序 'MySQL'

php - 将 WordPress 中的下拉列表或文本字段中的值传递到functions.php 中的 MySQL 查询

regex - grep 是否有任何命名的正则表达式捕获?

bash - 将文件中每一行的单词填充到临时数组中

bash - 将 grep 重定向到搜索目录中的文件会导致无限递归

php - MySQL数据库表关系

PHP MYSQL 数组 foreach 和插入

bash - 将 glob 结果传递给函数,丢弃除第一个文件以外的所有文件

bash - shell unix 中的 Concat 变量(日期)和字符串 - bash

linux - 如何在命令行中匹配另一个模式的目录中的 `find` 文件匹配模式?