我有一个日志文件,其中我们在错误的位置获取了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)
这将产生相同的输出。