sed 匹配 word1 和 word2 以获取中间的单词

sed 匹配 word1 和 word2 以获取中间的单词

我在尝试提取日志文件调用完整的 IP 地址时遇到问题。

这就是文件中的行的样子

[2016-11-10 11:22:42] NOTICE[24518] chan_sip.c:“62.210.189.39:6584”的“100”注册失败 - 密码错误

'我只需要和之间的 IP 地址:

下面是我的尝试并让它提取IP

sed -e "/failed[[:space:]]for[[:space:]]'*.*.*.*:*'/,/[[:space:]]-[[:space:]]Wrong[[:space:]]Password/p" full > output.txt

答案1

一个非常基本的解决方案使用cut

cut -d \' -f 4 < full | cut -d : -f 1 > output.txt
62.210.189.39

您可能需要将其过滤为仅Wrong Password几行,因此这里也有一些内容。

grep 'Wrong Password' full | cut -d \' -f 4 |cut -d : -f 1 > output.txt

这是一个稍微复杂的版本,使用sed

sed -e "s/.*failed for '\([0-9\.]*\):.*/\1/" full > output.txt

使用分组来提取括号中的 IP 地址

只是为了好玩我做了一个perl

perl -n -e "/failed for '([\d.]+):/ && print \$1 . \"\n\"" full > output.txt

这也是grep对我有用的问题的评论中的命令。

grep -oP '(\d{1,3}\.{1})+\d{1,3}' full > output.txt

答案2

你说,

我只需要 ' 和 之间的 IP 地址:

因此,让我们使用这些字符作为字段分隔符并选择 IP 地址:

$ awk -F "[':]" '{ print $7 }' file
62.210.189.39

如果您希望将输出限制为包含以下字符串的行Wrong password

$ awk -F "[':]" '/Wrong password/ { print $7 }' file

当以':作为字段分隔符分隔行时,您最终会得到以下字段:

[2016-11-10 11:22:42] NOTICE[24518] chan_sip.c: Registration from '"100" ' failed for '62.210.189.39:6584' - Wrong password
^^^^^^^^^^^^^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^ ^^^^^^ ^^^^^^^^^^^^ ^^^^^^^^^^^^^ ^^^^ ^^^^^^^^^^^^^^^^^
field1         f2 field3                       field4              field5 field6       field7        f8   field9

相关内容