Regex 如何对日期和特定字段的日志进行grep和筛选

Regex 如何对日期和特定字段的日志进行grep和筛选,regex,shell,awk,sed,grep,Regex,Shell,Awk,Sed,Grep,我的日志将有以下格式的行 test/blah.log.32:30141:2019-08-1216:40:09839 com.test.service.testService[P1-7XX8]INFO testMethod():userId:12345XX,someOtherId:12345xxxccddd,blah,blah…,_someType=V,blah,blah,blah,blah… 如何对包含文本的数据进行grep,然后从中过滤日期和用户ID。我的最终结果应该是 2019-08-12

我的日志将有以下格式的行

test/blah.log.32:30141:2019-08-1216:40:09839 com.test.service.testService[P1-7XX8]INFO testMethod():userId:12345XX,someOtherId:12345xxxccddd,blah,blah…,_someType=V,blah,blah,blah,blah…

如何对包含文本的数据进行grep,然后从中过滤日期和用户ID。我的最终结果应该是

2019-08-12 16:40:09839-12345XX


我可以使用
grep-Hn'\u someType=V'
执行grep,但无法过滤数据。

您可以通过管道将
grep
命令的输出传输到
sed
中,以将整行数据转换为两个相关的数据段:

grep '_someType=V' | sed -E 's/^([^ ]* [^ ]*).*userId: ([^ ]*).*/\1-\2/'
sed
s
substitution命令将与日期对应的行的前两个“单词”捕获到第一个捕获组中,并将紧跟在
userId
之后的单词捕获到第二个捕获组中,将整行匹配以替换为两个捕获组中由破折号分隔的内容

如果
\u someType=V
userId
之间的顺序始终相同,则可以不使用
grep
,例如如果
\u someType=V
始终出现在
userId
之后:

sed -nE 's/^([^ ]* [^ ]*).*userId: ([^ ]*).*_someType=V.*/\1-\2/p'

您可以使用
awk

awk -v s='userId: ' '/_someType=V/ && match($0, s "[^, ]+") {
   print $1, $2 "-" substr($0, RSTART+length(s), RLENGTH-length(s))
}' file


文件文本以
30141:
test/blah.log.32:
开头?@anubhava最有可能以
2019-08-12 16:40:09839 com.test…
test/blah.log.32
为文件名,而
30141
为行号,分别由
grep
-H
-n
将多个grep链在一起输出<代码>grep'_someType=V file | grep 2019-09-10'| grep userID?使用
-o
选项将输出限制到您的搜索目标。@如果OP要检索的两条数据是连续的,这将起作用。由于它们不是,您不能用
-o
同时选择它们,您必须使用
sed
来删除两段代码之间的内容data@Aaron:我正在将示例日志数据作为一条连续线读取。但是糟糕的是,数据没有更好地呈现,因此在解释上没有差异。但我喜欢下面两种解决方案,并希望它们能为O.P.工作。祝大家好运。
2019-08-12 16:40:09,839-12345XX