从shell和python中的行中删除字符串 - python

我有一个日志文件,其中我们在错误的位置获取了IP地址。

cat test.sh
173.36.31.10 dasdsafafa fafsafaasfa fafasfaa173.36.31.10
173.36.31.11 dasdsafafa fafsafaasfa fafasfaa173.36.31.11

如果您看到我上面的脚本,它有两次IP地址,这对我来说是错误的。我想编写一个删除第二个ID地址的脚本。

我正在考虑通过此操作获取cat test.sh | awk '{print $1}' IP地址,但是我不确定如何删除第二个IP地址。

我想用shell和python来做,有人可以帮我吗?

我感谢您的帮助。

python大神给出的解决方案

使用它作为测试文件:

$ cat test.sh
173.36.31.10 dasdsafafa fafsafaasfa fafasfaa173.36.31.10
173.36.31.11 dasdsafafa fafsafaasfa fafasfaa173.36.31.11

使用awk

这是从行尾删除IP的第二次出现的一种方法。

$ awk '{sub($1"$", "")} 1' test.sh
173.36.31.10 dasdsafafa fafsafaasfa fafasfaa
173.36.31.11 dasdsafafa fafsafaasfa fafasfaa

在awk中,$1指定该行的第一个字段。因此,如果第一个字段在行尾重复,则sub($1"$", "")将其删除。

更详细地,对于正则表达式,$表示行尾。因此,$1"$"将匹配该行结尾处第一个字段的任何重复出现。命令sub($1"$", "")用空字符串替换这种重复出现。

使用外壳

$ while read ip rest; do echo "$ip ${rest%$ip}"; done <test.sh
173.36.31.10 dasdsafafa fafsafaasfa fafasfaa
173.36.31.11 dasdsafafa fafsafaasfa fafasfaa

使用sed

这会寻找在行尾重复第一个单词的行。如果是这样,则删除重复项:

$ sed -r 's/([^ ]*)( .*)\1$/\1\2/' test.sh
173.36.31.10 dasdsafafa fafsafaasfa fafasfaa
173.36.31.11 dasdsafafa fafsafaasfa fafasfaa

使用python

with open('test.sh') as fhandle:
    for line in fhandle:
        line = line.rstrip()
        ip=line.split()[0]
        if line.endswith(ip):
            line=line[:-len(ip)]
        print(line)

这将产生相同的输出。