我编写了一个 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
我已经更新了标签以防其他人遇到此问题。