我想过滤字符串中的单词从下面的命令中,我可以在“TCP”过滤器中输出单词
awk '{print substr($0, index($0, "{TCP}"))}'
这是我的示例输入
01/08-21:03:05.312358 [] [1:5000001:1] Attack Detected [] [Priority: 0] {TCP} 139.150.160.188:40001 -> 192.168.2.1:80`
所以我希望在之后提取ip {TCP}
。我已经使用 提取了sed
。我想知道日志文件是否有{ICMP}
and{UDP}
协议,我可以通过使用||
Between 字符串来过滤它,就像 OR 运算一样吗?
我还可以通过在过滤器中使用“OR”来过滤 UDP 和 ICMP 吗?可以这样吗...?
awk '{print substr($0, index($0, "{TCP}" || "{UDP}" ||"{ICMP}"))}'
谢谢。
答案1
可以使用awk
,但 REGEXP 语法的工作方式与C
-style 布尔运算符有些不同。假设您想要在您提到的所有情况下提取 IP 地址,则以下操作应该有效:
awk '{if (match($0,/{(TCP|UDP|ICMP)} ([[:digit:]:.]{15})/,v)) print(v[2])}' logfile.txt
这里使用 的match
函数awk
来搜索字符串TCP
orUDP
或ICMP
,后跟一个空格和一个 IPv4(即由数字0-9
或句点组成的 15 个字符.
),并提取正则表达式后半部分的实际值(即 sub - 分组在括号中)并将其存储在awk
内部数组 varuable中v
。
如果找到这样的匹配,它会打印第二个分组子表达式v[2]
的实际值(第一个是协议的 OR 组)。(...)
请注意,该函数的使用match()
需要 GNU Awk!
请注意,由于这是一个简单的操作语句,其中如果match()
满足条件(调用返回非零),则仅执行一个操作,因此它也可以用通常的“ <condition> { <actions> }
”语法编写awk
,即
awk 'match($0,/{(TCP|UDP|ICMP)} ([[:digit:]:.]{15})/,v)) {print v[2]}' logfile.txt