输出.txt
1.1.1.1:22/ does not support password authentication. [ERROR] target ssh://2.2.2.2:22/ does not support password authentication. [ERROR] target ssh://3.3.3.3
我想:22/ does not support password authentication. [ERROR] target ssh://
从新output.txt
文件中删除字符串并将 IP 地址放入其中
期望输出:
1.1.1.1
2.2.2.2
3.3.3.3
我尝试过
cat output.txt | grep -vE "(:22/ does not support password authentication. [ERROR] target ssh://)
和
cat output.txt | egrep -v ":22/ does not support password authentication. [ERROR] target ssh://"
但 cat output.txt | grep -v ":22/ does not support password authentication. [ERROR] target ssh://"
以上 3 条命令并未删除任何内容。尝试使用 awk - 结果相同:
awk '{gsub(":22/ does not support password authentication. [ERROR] target ssh://","");print}' output.txt
我没有尝试,sed
因为我的字符串包含转义字符
答案1
这是一个完成这项工作的 perl 单行程序:
perl -ape 's/.*?(\d+(?:\.\d+){3})/$1\n/g' file.txt
1.1.1.1
2.2.2.2
3.3.3.3
解释:
s/ # substitute
.*? # 0 or more any character but newline
( # start group 1
\d+ # 1 or more digits
(?: # start non capture group
\. # a dot
\d+ # 1 or more digits
){3} # end group, must appear 3 times
) # end group 1
/ # with
$1\n # content of group 1 (i.e. the IP), followed by linefeed
/g # global
如果只想匹配 IP 地址,则必须将\d+
上述正则表达式中的所有出现的替换为:
(?:25[0-5]|2[0-4]\d|[01]\d?\d?)
得到:
s/.*?((?:25[0-5]|2[0-4]\d|[01]\d?\d?)(?:\.(?:25[0-5]|2[0-4]\d|[01]\d?\d?)){3})/$1\n/g
答案2
sed
是删除任意字符串的正确方法。一般情况下,您需要处理语法、转义字符等。
grep
查找有或没有匹配的行。它不能轻易删除字符串。它-o
可以显示匹配的碎片行。如果您可以为需要保留的内容构建正则表达式,而不是为需要删除的内容构建正则表达式,这将非常有用。(您grep
可能支持也可能不支持-o
;POSIX 不要求此选项。)
在您的示例中,存在这样的正则表达式。命令将是:
<output.txt grep -o '[[:digit:]]\+\.[[:digit:]]\+\.[[:digit:]]\+\.[[:digit:]]\+'
正则表达式匹配四个用点分隔的数字序列。数字序列必须至少包含 1 位数字,因此...
不会匹配;但999.888.12345678.0
会匹配。如果这是一个问题,那么您应该构建一个更好的正则表达式或选择其他方法(可能通过实际删除您最初想要的不需要的字符串来实现)。