2014-12-03 66 views
3

我有一个通用SQL查询,我希望使用bash使用从我从中获取字符串的grep命令填充所有行。我从文件中获取的字符串数量也不尽相同。如何在查询中填充SQL

例子查询:

select * from table_name 
    where column_name in ('string', 
    'string', 
    'string', 
    'string', 
    'string', 
    'string', 
    'string',) 

基本上我在看电子邮件ID和我得到的消息ID的输出。每行一个字符串。

grep -Eoh "[a-z0-9]{0,9}\.0\.[0-9]{0,9}\.00\-[0-9]{0,9}\.[0-9]{0,9}\.[a-z0-9{0,10}\.hostname.com" *filename.txt 

62e60645.0.2279968.00-2316.3908868.d02c12m066.hostname.com 
3ebe0645.0.522591.00-2200.908364.a02c11m025.hostname.com 
356f0645.0.1401456.00-2085.2306795.g02c12m014.hostname.com 
9a001645.0.1594149.00-1533.2646910.y01c12m093.hostname.com 

等等。

我希望做的是有所有字符串从到查询自动插入我的grep命令,这样我就可以简单地粘贴在串并运行。

+0

grep命令的输出包含需要在该sql查询中的字符串? – 2014-12-03 19:53:46

+0

这是正确的。 – dguard 2014-12-03 19:54:38

回答

3
$ echo 'select * from table_name where column_name in ('"$(grep -Eoh '[a-z0-9]{0,9}\.0\.[0-9]{0,9}\.00\-[0-9]{0,9}\.[0-9]{0,9}\.[a-z0-9]{0,10}\.hostname.com' *filename.txt | awk -v ORS=', ' '{print "\047"$0"\047"}')"')' 
select * from table_name where column_name in ('62e60645.0.2279968.00-2316.3908868.d02c12m066.hostname.com', '3ebe0645.0.522591.00-2200.908364.a02c11m025.hostname.com', '356f0645.0.1401456.00-2085.2306795.g02c12m014.hostname.com', '9a001645.0.1594149.00-1533.2646910.y01c12m093.hostname.com',) 

固定在一个错字你grep正则表达式。您错过了最后一个范围的结尾]

内部awk命令执行行到列表格式。

awk -v ORS=', ' '{print "\047"$0"\047"}')"' 

-v ORS=', '设置ORS(输出记录隔板,

{print "\047"$0"\047"}打印与'每行之前和之后它与ORS值在结束时加入。

3

也可以通过由线和呼应迭代线完成它:

#!/bin/bash 
echo 'select * from table_name where column_name in (' 
{ 
    read 
    echo -n "'$REPLY'" 
    while read; do 
     echo -ne ",\n'$REPLY'" 
    done 
} < <(grep -Eoh '[a-z0-9]{0,9}\.0\.[0-9]{0,9}\.00\-[0-9]{0,9}\.[0-9]{0,9}\.[a-z0-9]{0,10}\.hostname.com' *filename.txt) 
echo ')' 

这里$REPLY包含从由process substitution<(grep ...))所提供的输入的读取线(逐个)。

+0

我的荣幸。请参阅:http://stackoverflow.com/help/someone-answers – whoan 2014-12-04 14:45:45