【问题标题】:Bash script to search multiple strings in text file用于在文本文件中搜索多个字符串的 Bash 脚本
【发布时间】:2019-08-08 06:57:35
【问题描述】:

我创建了一个脚本来搜索文本文件中的字符串并输出包含该字符串的所有行:

    #!/bin/sh
STRING=$1
FILE=dsat.txt
if grep -q $STRING $FILE;
  then
        echo -e "$(grep $STRING $FILE)\n"
else
        echo "Not found"
        exit 0
fi

我想对此进行扩展,我在文本文件中有多个详细信息,例如

Word1 Word2 - Word3 Word4 Word5
Word1 Word6 Word3 Word7 Word8

在搜索中我搜索“Word1 Word3”

我希望它仍然输出这些行,因为搜索案例与此行匹配。

这可以使用 grep 吗?

更新:

    #!/bin/sh
FILE=text.txt
STRING='$1'

grep "$(sed 's/  */\\|/g' <<<"$1")" $FILE

所以当我运行脚本时,我会执行 script.sh Word1 Word2 但它似乎也不搜索 word2 谢谢

【问题讨论】:

    标签: bash shell grep


    【解决方案1】:

    直到我理解你的问题,你的意思是说匹配多个模式?

    如果这就是你的要求,

    grep 'A B\|A B C' file
    

    将打印带有A BA B C 的所有行。 | 用于 this pattern | or this pattern。但它需要反斜杠。 对于不使用反斜杠的情况,您可以提供 -E 标志。

    更新:

    假设您将所有单词存储在words

    grep "$(sed 's/  */\\|/g' <<<"$words")" file
    

    【讨论】:

    • 不要认为这是我想要的,我之前尝试过,但没有给我需要的输出。假设我有一行,例如“Word1 Word2 - Word3 Word4 Word5”“Word1 Word6 Word3 Word7 Word8”并且在搜索中我搜索“Word1 Word3”我希望它仍然输出这些行,因为搜索案例与此行匹配。
    • 非常感谢,但 search_str"A C" 不一定是这些值,它可能是最多 10 个值......我觉得这需要一个 for 循环,但不知道如何去做吧。
    • @user3411002,您只需将这些值放入search_str="word1 word2 word3 ..."
    • @user3411002,我已经相应地更新了答案,cmets 似乎删除了必要的空格。
    • @user3411002,您只需将$1 更改为"$@",如grep "$(sed 's/ */\\|/g' &lt;&lt;&lt;"$@")" $FILE。 Shell 以空格分隔的方式接受参数,这意味着 $1 仅包含 Word1"$@" 包含在单个字符串中传递给 shell 的所有参数。
    【解决方案2】:

    grep -f 从文件中读取几个模式

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-19
      • 1970-01-01
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 2019-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多