我已经提取了持续破坏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
逻辑:打印第一个单词和方括号的内容。