我有一个日志文件,其中我们在错误的位置获取 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/