gpt4 book ai didi

linux - 尝试使用 grep 匹配同一行上的多个模式

转载 作者:太空宇宙 更新时间:2023-11-04 10:18:07 28 4
gpt4 key购买 nike

我很郁闷。我正在多个文件中搜索看起来像这样的多行(通过 find-ing 所需的开始日期)并通过管道传递给 grep,以便我可以使用此命令提取行组:

find logdir/ -type f -regextype sed -regex ".*2016-06-22.*" | while read fname
do
zgrep -a -P -B9 ".*COOKTHE.*slave.*" $fname
done

所以我可以输出这样的行组:

2017-05-10 12:14:54 DEBUG[dispatcher-1533] something.else.was.here.Pia - http://server:9999/cookout/123123123123/entry c7aab5a3-0dab-4ce1-b188-b5370007c53c request:
HEADERS:
Host: server:9999
Accept: */*
User-Agent: snakey-requests/2.12.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Timeout-Access: <function1>
CONTENT:
{"operation": "COOKTHE", "reason": "sucker verified", "username": "slave"}

我试图从第一行匹配中提取整个字符串日期模式(2017-05-10 12:14:54)数字模式123123123123从最后一行开始,整行匹配。 ({"operation": "COOKTHE", "reason": "sucker verified", "username": "slave"})

如何使用 grep、sed 或 awk 提取这些信息?

最佳答案

首先,让我们简化您的初始查询。我认为您在那里不需要正则表达式;通配更简单、更快、更易读。同样,您不需要 grep 的 -P 选项,因为您没有使用 PCRE。这也会减慢速度。

find logdir/ -type f -name '*2016-06-22*' | while read fname
do
zgrep -a -B9 '"COOKTHE".*"slave"' "$fname"
done | grep -e ^20 -e '{'

这重新创建了您的原始逻辑,但应该运行得更快一些。它还添加了一个过滤器以仅显示您要求的两行。但是,我担心 -B9 不是一个好的解决方案,因为要跟踪的 header 数量可能不定。为了快速起见,最终过滤器也有些简陋。

这里有一个更完整的解决方案:

find logdir/ -type f -name '*2016-06-22*' | while read fname
do
zcat "$fname" | awk '
/^20/ && $6 ~ /^http/ {
split($6, url, "/") # split the URL by slashes
stamp = $1 " " $2 " " url[5] # "2017-05-10 12:14:54 123123123123"
}
/{.*"COOKTHE".*"slave"/ { print stamp; print }
'
done

这会将日期、时间和 URL 的第 5 个片段保存在 stamp 变量中,并且仅当您在 JSON 行中找到匹配项时才打印它。我修改了您的正则表达式以包含一个 { 以指示 JSON 的开头以及引号以改进您的匹配,但您可以将其更改为您喜欢的任何内容。您不需要在此正则表达式上的前导或尾随 .*

AWK 连接相邻项,因此 $1 ""$2 ""url[5] 仅表示第一列的值,一个空格,第二列,另一个空格,然后是 URL 的第 5 个项(注意“http:”之后的空项)。

这不会告诉您匹配的文本来自哪个文件(与 grep -H 比较)。为此,您需要:

  zcat "$fname" | awk -v fname="$fname:" '
# … (see above)
/{.*"COOKTHE".*"slave"/ { print fname stamp; print fname $0 }
'

如果您要查找的 JSON 字符串的位置和间距始终如一,则可以改用最后一个子句 $2 ~/"COOKTHE"/&& $NF ~/"slave"/在较长的线路上提高 awk 的速度(实际上,它更快地失败的能力)。

关于linux - 尝试使用 grep 匹配同一行上的多个模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45186440/

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