首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用regex重新格式化日志文件

用regex重新格式化日志文件
EN

Stack Overflow用户
提问于 2022-02-07 01:35:11
回答 1查看 88关注 0票数 0

我使用grep过滤日志文件中的某些行,并将它们呈现给我的conky配置。日志文件是/var/ log /messages。这些条目与UFW块事件有关。

问题是,我只关心每一行的某些字符串。我可以grep唯一的UFW块,但这条线太长,不适合在康克。即使康奇不是方程式的一部分,学习只显示一根圆木线的片段对我将来也会有好处。

我已经通过使用以下方法得到了一些进展:

grep -Ewoh '(IN=([a-z]){4,})|((DST|SRC)=(([0-9]){1,3}\.){3,}([0-9]){1,3})|(PROTO=[a-z]{2,6})|((SPT|DPT)=[0-9]{1,5})' /var/log/messages

这个难看的regex正在过滤条目(如)如下:

代码语言:javascript
复制
IN=wlan0
SRC=10.10.123.23
DST=192.168.41.23
PROTO=TCP
SPT=443
DPT=41080

哪一行(几乎)是这样的:

代码语言:javascript
复制
'
IN=([a-z]){4,}
(DST|SRC)=(([0-9]){1,3}\.){3,}([0-9]){1,3}
PROTO=[a-z]{2,6}
(SPT|DPT)=[0-9]{1,5}
'

问题是,这会为每个匹配的单词生成一个新的行,我只想要在它们的行中过滤每一行的字符串。

代码语言:javascript
复制
$ grep -Ewoh '(IN=([a-z]){4,})|((DST|SRC)=(([0-9]){1,3}\.){3,}([0-9]){1,3})|(PROTO=[a-z]{2,6})|((SPT|DPT)=[0-9]{1,5})' /var/log/messages
IN=wlan
SRC=103.81.76.20
DST=172.31.77.54
SPT=443
DPT=41080
$

我宁愿不使用非常复杂的awk方法,除非我能在几个月后回到它并且很容易记住它。awk是令人难以置信的,但如果你只掉一次球,就很难消化!

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-07 05:29:56

如果我正确理解,而不是grep -o提供的列表,您希望删除不匹配的字符串,并且只打印匹配的字符串。即。在线条和顺序上它们的出现。

使用gawkFPAT

代码语言:javascript
复制
gawk -v FPAT='my-regex' '$1=$1'

  • my-regex替换为您希望看到的字符串的正则表达式。
  • 将按顺序在每一行上打印由空格分隔的匹配。
  • 添加-v OFS=以删除空格,或者例如添加-v OFS=', '以更改分隔字符串。H 213H 114您使用grep -w来匹配整个单词。您可以在gawk正则表达式中使用左、右单词边界(respectively).
  • For示例中的\<\>,在“或”操作符的整个列表周围添加括号和单词边界- (|):
  • -v FPAT='\<((IN=([a-z]){4,})|((DST|SRC)=(([0-9]){1,3}\.){3,}([0-9]){1,3})|(PROTO=[a-z]{2,6})|((SPT|DPT)=[0-9]{1,5}))\>'
  • Note - regex中的bug,例如tshiono注释,这与PROTO=TCP.

不匹配。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71012617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档