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

标签 python linux bash shell awk

我有一个日志文件,其中我们在错误的位置获取 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 中执行此操作,有人可以帮助我吗?

感谢您的帮助。

最佳答案

使用它作为测试文件:

$ 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"$", "") 将此类重复出现替换为空字符串。

使用 shell

$ 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)

这会产生相同的输出。

关于python - 从 shell 和 python 中的行中删除字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30203276/

相关文章:

Python 引发异常并返回默认值

java - 在tomcat中手动解包 war 的问题

php - 如何安装 laravel 已经建好的网站

bash - 将 bash 变量传递给 awk 以提取某些位置的字符

linux - Bash:检查脚本是否已经在此计算机上运行

python - Tkinter:在背景图像上叠加标签

python - 数据描述符优先级在python中是如何工作的

python - Django 非唯一用户名字段警告

linux - Git remote 尝试以我当前的本地用户身份连接到我的服务器

linux - 如何替换bash脚本中的[]?