使用grep查找文本,如果在文件中找到该文件中的另一个字符串

时间:2014-11-20 17:02:55

标签: linux bash grep

我想知道是否有一个班轮来做我正在寻找的东西,或者我是否必须写一个bash脚本。我要做的是在目录中递归搜索,如果找到我正在查找的字符串,则搜索该文件以获取另一个字符串并将其打印到屏幕上。因此,在此示例中,我想知道“X-Spam-Status”标题的分数是否在电子邮件中的范围之间,如果是,则打印出发件人或该电子邮件中的主题标题。

示例:

我使用的命令是:

grep 'X-Spam-Status: .* score=[5-9]\.' /var/email/example.com/example/cur/* | wc -l

以下是我需要在以下位置找到此信息的标题:

X-Spam-Status: No, score=6.5 required=5.0 tests=HTML_MESSAGE,
        RCVD_IN_DNSWL_NONE,T_DKIM_INVALID,URIBL_BLOCKED autolearn=ham version=3.3.2

如果grep在上面的标题中找到匹配项,请从同一封电子邮件中找到并回显此标题:

From: "From the Desk of Allen Watson" <FromtheDeskofAllenWatson@emadest.eu>
Subject: Don't Live in Fear of Loud Noises

它可以是主题或来自。它不一定是两者。

2 个答案:

答案 0 :(得分:1)

这样的东西?

find /path/to/files -type f | xargs -i grep "searchterm" {} | grep -o "othersearchterm"

find /path/to/files -type f | xargs -i grep "X-Spam-Status" {} | egrep -o '(From|Subject).*'

答案 1 :(得分:1)

此解决方案首先使用find,它具有文件过滤器。 为确保正确处理文件名中的空格,交换机 -print0 用于创建空终止文件名列表。

xargs使用此列表将参数传递给grep命令,该命令也输出一个空终止行。您可以根据需要使用尽可能多的xargs grep组合。

如果要读取输出,管道中的最后一个命令没有 -Z 。在我们的例子中,我只使用head -2输出文件的前两行。

function grep2strings_recursive() {
    if [ '0' = "$#" ]; then
        echo "Usage: $FUNCNAME <dir> <string1> <string2>"
        return
    fi
    find "$1" -type f -print0 | xargs -0 grep -lZ "$2" | xargs -0 grep -lZ "$3" | xargs -0 head -2
}

grep2strings_recursive '/var/email/example.com/example/cur'  'X-Spam-Status: .* score=[5-9]\.' 'From'

使用空输出终止符( -print0和-Z )和空输入终止符( -0 )以确保空间情况下的正确行为非常重要/ tab / newlines文件名中的字符。