在shell和python中删除行中的字符串

在shell和python中删除行中的字符串,python,linux,bash,shell,awk,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地址

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“$”,“”)
用空字符串替换这样的重复出现

使用外壳 使用python
这将产生相同的输出。

使用Perl

cat test.sh | perl -ne 's/^(\d+\.\d+\.\d+\.\d+)(.*)\1$/$1$2/; print'

两件事:所有的字符串都是这样的长度和格式吗?为什么在python和shell中都需要这个?如果需要“shell”和python,为什么要用awk标记它?通常,当人们说shell时,他们指的是包括awk的所有标准UNIX工具,那么为什么还要用python呢?或者你是说你需要2种不同的解决方案一个在shell /AWK,另一个在Python?问题是,如果IP地址在字符串的中间呢?我们该怎么处理呢?
$ sed -r 's/([^ ]*)( .*)\1$/\1\2/' test.sh
173.36.31.10 dasdsafafa fafsafaasfa fafasfaa
173.36.31.11 dasdsafafa fafsafaasfa fafasfaa
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)
cat test.sh | perl -ne 's/^(\d+\.\d+\.\d+\.\d+)(.*)\1$/$1$2/; print'