我使用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正在过滤条目(如)如下:
IN=wlan0
SRC=10.10.123.23
DST=192.168.41.23
PROTO=TCP
SPT=443
DPT=41080哪一行(几乎)是这样的:
'
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}
'问题是,这会为每个匹配的单词生成一个新的行,我只想要在它们的行中过滤每一行的字符串。
$ 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是令人难以置信的,但如果你只掉一次球,就很难消化!
谢谢。
发布于 2022-02-07 05:29:56
如果我正确理解,而不是grep -o提供的列表,您希望删除不匹配的字符串,并且只打印匹配的字符串。即。在线条和顺序上它们的出现。
使用gawk的FPAT
gawk -v FPAT='my-regex' '$1=$1'my-regex替换为您希望看到的字符串的正则表达式。-v OFS=以删除空格,或者例如添加-v OFS=', '以更改分隔字符串。H 213H 114您使用grep -w来匹配整个单词。您可以在gawk正则表达式中使用左、右单词边界(respectively).\<和\>,在“或”操作符的整个列表周围添加括号和单词边界- (|):-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}))\>'PROTO=TCP.不匹配。
https://stackoverflow.com/questions/71012617
复制相似问题