gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:18:03 25 4
gpt4 key购买 nike

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

例子:

我使用的命令是:

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

这是我需要在其中找到此信息的 header :

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

可以是主语也可以是发件人。不需要两者兼而有之。

最佳答案

这个解决方案首先使用一个查找,它有一个文件过滤器。为确保正确处理文件名中的空格,开关 -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/文件名中的换行符。

关于linux - 使用 grep 查找文本,如果在文件中找到回显该文件中的另一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27045325/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com