我在尝试提取日志文件调用完整的 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