如何使用grep查找给定的字符串

时间:2015-05-07 14:35:15

标签: bash unix grep

我从stackoverflow中读到了一些关于这个问题的例子,但没有一个帮助过我。

我有一个文件夹,其中有一些sql文件。我想要做的是浏览所有sql文件并搜索短语并检查它是否存在。主要问题是写一个这个短语的grep表达式。

该短语有一个模式:

  

&安培; uniq的...

(例如:&uniq.hgk56kh/gfgtk&uniqjfru5u5gggggt等等)

&uniq之后只有21个符号,所以整个表达式最多可以有26个符号。

你知道我该怎么做呢?

我的例子确实无效:

for f in `ls $WORKDIR/*.sql`
do
if [ $(grep '[&uniq.*]\{1,26}' $f) == 0 ]; then echo
if [ $(grep -w '[&uniq.*{1,26}]' $f) == 0 ]; then echo
if [ $(grep -E '[&uniq.[[:alnum:]]{1,26}}' $f) == 0 ]; then echo
if [ $(grep -E '&uniq.[[:alnum:]]{1,26}' $f) == 0 ]; then echo
if [ $(grep -E '&uniq.[A-Za-z0-9]{1,26}' $f) == 0 ]; then echo
if [ $(grep -E '[&uniq.[A-Za-z0-9]{1,26}]' $f) == 0 ]; then echo
if [ $(grep -w '[&uniq.[A-Za-z0-9]\{1,26\}]' $f) == 0 ]; then echo
if [ $(grep -w '[&uniq.*\{1,26\}]' $f) == 0 ]; then echo
if [ $(grep -w '[&uniq.*}\{1,10\}' $f) == 0 ]; then echo
if [ $(grep -E '[&uniq.[A-Za-z0-9]{1,26}' $f) == 0 ]; then echo
if [ $(grep -E '[&uniq.*{1,26}' $f) == 0 ]; then echo
if [ $(grep -E '&uniq.*'{1,26} $f) == 0 ]; then echo
if [ $(grep -E '&uniq.*.\{1,26\}' $f) == 0 ]; then echo
if [ $(grep -E '&uniq.[A-Za-z0-9]{1,26}' ~/$f) == 0 ]; then echo
if [ $(grep -e '[&uniq.*]\{1,26}' $f) == 0 ]; then echo
done

输入的一些例子: 正确:     &安培; uniq._short_examples     &安培; uniq._ifs21t     &安培; uniq._FM_Z2IO_RHHU     &安培; uniq._kontr_save 不正确:     &安培; uniq.another_example_of_way_to_long_string     &安培; uniq.fhtygjygjyj767kjuhkhk87k8ukgfh56yhgyj76jujhyjk

这些示例之间是一些典型的sql文件行,如下所示:

SELECT  a.YY,
        a.RRX_ID,
        a.MSRG_TYPE,
        a.TGHSEB,
        a.PROVIDERHJJ,
        a.SALE_PROVIDERYTR,
        a.REQUEST_PPL,
        a.CONTENT_NAME, -- Name of content
        a.CONTENT_TYPE,  -- Name of content2
        b.NET_AMOUNT,
        a.SALE_MODEL_FROM_PAST,   
        a.SERVICE_MODE_ON,  
        a.RESPONSE_STATUS_CODE,
        a.ERROR_DESC_FILE
FROM    BBV.RAQ45_TJKIO a,
        (SELECT * from &uniq.FGGT8IO) b

1 个答案:

答案 0 :(得分:6)

我建议使用以下内容:

for f in /path/to/sql/files/*.sql; do
    if grep -q '&uniq.\{1,21\}' "$f"; then
        echo "match in file $f"
    fi
done

这匹配"& uniq",后面是目录$f中任何文件中的1到21个字符。 -q切换到grep表示没有输出,grep的返回码表示是否匹配。

大概你也想在模式的任何一边添加一些边界,这样你就不会像abc&uniqabc123abc123abc123 123456789那样匹配。执行此操作的最佳方法取决于您的输入和您正在使用的grep版本。

根据您的示例输入判断,您可以使用模式' &uniq.\{1,21\})'将模式与之前的空格匹配,然后将结束)匹配。

根据评论中的额外信息,您应该将模式更改为'&uniq\.[[:alnum:]]\{1,21\}[^[:alnum:]]',以匹配&uniq之后的文字点,1到21个字母数字字符,然后是任何非字母数字字符。