如何使用 awk 在子字符串索引中使用 OR

如何使用 awk 在子字符串索引中使用 OR

我想过滤字符串中的单词从下面的命令中,我可以在“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来搜索字符串TCPorUDPICMP,后跟一个空格和一个 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

相关内容