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