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

Bash 如何使用sed或awk从线路中提取月、月日和IP地址?,bash,awk,sed,Bash,Awk,Sed,我已提取了持续不断地影响我的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.2

我已提取了持续不断地影响我的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
读取时-r行
做
monthday=$(echo$行| awk'{print$1}')
#ip=$(echo$line | awk-F'[\\\\[\\\]]'{print$2})
ip=$(回声$行|切-d[-f2 |切-d]-f1)
回显“${monthday}${ip}”
完成
试试这个

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

不需要循环。

使用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
请注意,字段分隔符是一个正则表达式,即括号表达式
[]]
。从:

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

所以表达式必须是

[\[\] ]
但是,由于存储在字符串(“”)中的正则表达式会被扫描两次,因此我们必须避开反斜杠:

-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
输出:

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很简单:

$ 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

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

您可以使用此处答案中列出的命令之一提取IP地址:我发现它简单易懂:)您介意描述一下吗?@satch_boogie,是的,请参阅我的解释W感谢我有一个关于“[[]”的问题长久以来,现在,它的喝彩声已经清晰了:)