如何使用sed或awk从线路中提取月份、日期和IP地址



我已经提取了持续破坏IMAP服务器的日期/月份和IP:

Nov1 unknown[186.216.99.239]:
Nov1 unknown[62.249.196.214]:
Nov1 unknown[110.145.123.120]:
Nov1 fixed-187-190-251-149.totalplay.net[187.190.251.149]:
Nov1 pd9568164.dip0.t-ipconnect.de[217.86.129.100]:
Nov1 unknown[103.227.88.130]:

我希望输出如下:

Nov1 186.216.99.239
Nov1 62.249.196.214
Nov1 110.145.123.120
Nov1 187.190.251.149
Nov1 217.86.129.100
Nov1 103.227.88.130

我使用sed、awk和cut与以下代码的组合实现了这个结果,但我想知道是否有更好的方法?

while read -r line
do 
monthday=$(echo $line | awk '{ print $1 }')
# ip=$(echo $line | awk -F'[\[\]]' { print $2 } ) 
ip=$(echo $line| cut -d[ -f2| cut -d] -f1 )
echo "${monthday} ${ip}"
done < badIpList.txt

使用awk:将字段分隔符设置为空格、[]中的任意一个,然后打印第一个和第三个字段:

$ awk -F "[][ ]" '{ print $1, $3 }' infile
Nov1 186.216.99.239
Nov1 62.249.196.214
Nov1 110.145.123.120
Nov1 187.190.251.149
Nov1 217.86.129.100
Nov1 103.227.88.130

请注意,字段分隔符是一个正则表达式,即括号表达式[][ ]。来自gawk手册:

若要在括号表达式中包含字符]-^之一,请在其前面放一个

因此表达式必须是

[[] ]

但是,由于存储在字符串中的正则表达式("dynamic/computered regexp")会被扫描两次,因此我们必须转义反斜杠:

-F '[\[\] ]'

或者像我一样使用双引号,我必须对反斜杠和反斜杠进行转义:

-F "[\[\] ]"

这显然不太可读。值得庆幸的是,有一个漏洞:

此外,如果将]放在开头的[之后,则右括号将被视为要匹配的字符之一。

所以我们可以逃脱

-F "[][ ]"

甚至在双引号内。顺便说一句,这里没有真正的理由使用双引号。

awk解决方案:

awk -F'[[:space:]\[\]]' '{print $1,$3}' file
  • -F'[[:space:]\[\]]'-复杂字段分隔符,空白[:space:][]。因此,行,例如Nov1 unknown[186.216.99.239]:将被划分为字段:1)Nov1,2)unknown,3)186.216.99.239和4):

输出:

Nov1 186.216.99.239
Nov1 62.249.196.214
Nov1 110.145.123.120
Nov1 187.190.251.149
Nov1 217.86.129.100
Nov1 103.227.88.130

尝试这个

sed -E 's/s.*[(.*)]:/ 1/' file

不需要循环。

简单的sed:

$ sed -r 's|^([^ ]*)[^[]*[([^]]*)].*|1 2|' badIpList.txt
Nov1 186.216.99.239
Nov1 62.249.196.214
Nov1 110.145.123.120
Nov1 187.190.251.149
Nov1 217.86.129.100
Nov1 103.227.88.130

逻辑:打印第一个单词和方括号的内容。

最新更新