删除以字符串开头的行

删除以字符串开头的行

我编写了一个 bash 脚本,用于将某些目录备份到云端。然后我将输出定向到日志文件。

日志文件由以“upload”或“Completed”开头的行组成。我试图删除所有以“Completed”开头的行(它只告诉我上传的数据量),并保留以“upload”开头的行。这将为我提供已上传文件的列表。它看起来像这样:

Completed 26.0 KiB/~26.0 KiB (109.4 KiB/s) 
upload: Documents/Homepage/Home.html 
Completed 26.0 KiB/~26.0 KiB (109.4 KiB/s) 
Completed 26.9 KiB/~26.9 KiB (109 Bytes/s) 
upload: Documents/backup.sh 
Completed 26.9 KiB/~26.9 KiB (109 Bytes/s) 
                                                                                     

我研究并尝试了很多方法,但似乎都不起作用。例如,我相信这应该能满足我的要求:

sed '/^Completed/d' kdoc.log > kdoc.bak

但这最终会删除文件里的每一行。

如果我尝试的sed '/^Completed*$/d' kdoc.log > kdoc.bak话,就不会删除任何内容。

我也尝试过相反的方法:删除任何行没有从上传开始:

sed '/^upload/!d' kdoc.log > kdoc.bak

但这也会删除文件中的每一行。

如果我尝试在字符串的任何部分搜索“Completed”(即ed '/Completed/d' kdoc.log > kdoc.bak),它也会删除文件中的每一行。

我不知道我做错了什么。我访问过的每个描述如何操作的页面都告诉我这些应该可以工作,但事实并非如此。你知道我做错了什么吗?目前在 Ubuntu 22.04 上运行 sed 4.8。

编辑:

cat -A kdoc.log根据@muro添加内容:

Completed 26.0 KiB/~26.0 KiB (109.4 KiB/s) $
upload: Documents/Homepage/Home.html $
Completed 26.0 KiB/~26.0 KiB (109.4 KiB/s) $
Completed 26.9 KiB/~26.9 KiB (109 Bytes/s) $
upload: Documents/backup.sh $
Completed 26.9 KiB/~26.9 KiB (109 Bytes/s) $
                                                                                     $

编辑2:

完整脚本如下:

#!/bin/bash

aws s3 sync /local s3://remotebucket > kdoc.log 2> kdoc_error.log

sed '/Completed.*$/d' kdoc.log > kdoc.bak

答案1

@steeldriver 是正确的:输出中有一些东西aws s3 sync。事实证明,生成的文件包含光标返回(^M)而不是换行符。在 sync 命令将光标返回转换为换行符后,将此行添加到脚本中,然后sed可以使用:

sed -i ':a;N;$!ba;s/\r/ \n/g' kdoc.log

我已经更新了标签以防其他人遇到此问题。

相关内容