首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从shell和python中删除行中的字符串

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

Stack Overflow用户
提问于 2015-05-13 07:44:44
回答 2查看 504关注 0票数 2

我有一个日志文件,我们在错误的地方获取ip地址。

代码语言:javascript
复制
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,有人能帮我吗?

我很感谢你的帮助。

EN

回答 2

Stack Overflow用户

发布于 2015-05-13 09:59:46

使用此文件作为测试文件:

代码语言:javascript
复制
$ 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的一种方法。

代码语言:javascript
复制
$ 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

代码语言:javascript
复制
$ 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

这将查找行中第一个单词在行尾重复的任何行。如果是,则删除重复:

代码语言:javascript
复制
$ sed -r 's/([^ ]*)( .*)\1$/\1\2/' test.sh
173.36.31.10 dasdsafafa fafsafaasfa fafasfaa
173.36.31.11 dasdsafafa fafsafaasfa fafasfaa

使用python

代码语言:javascript
复制
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)

这会产生相同的输出。

票数 4
EN

Stack Overflow用户

发布于 2015-05-13 14:50:48

使用Perl的

代码语言:javascript
复制
cat test.sh | perl -ne 's/^(\d+\.\d+\.\d+\.\d+)(.*)\1$/$1$2/; print'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30203276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档