从文件中删除特定字符串

从文件中删除特定字符串

输出.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会匹配。如果这是一个问题,那么您应该构建一个更好的正则表达式或选择其他方法(可能通过实际删除您最初想要的不需要的字符串来实现)。

相关内容