![如何将 shell stdout 重定向到文件的第一行?](https://linux22.com/image/179556/%E5%A6%82%E4%BD%95%E5%B0%86%20shell%20stdout%20%E9%87%8D%E5%AE%9A%E5%90%91%E5%88%B0%E6%96%87%E4%BB%B6%E7%9A%84%E7%AC%AC%E4%B8%80%E8%A1%8C%EF%BC%9F.png)
shell标准输出重定向到文件的最后一行,有没有办法将其写入文件的第一行?
由于 stdout 的内容是不可预测的,我怀疑这可能需要改变 stdout 的默认行为,但我不确定是否可行。
示例,将时间戳重定向到文件
echo `date` >> test.txt
默认保存到文件的最后一行
Mon Aug 31 00:40:27 UTC 2020
Mon Aug 31 00:40:28 UTC 2020
Mon Aug 31 00:40:29 UTC 2020
Mon Aug 31 00:40:30 UTC 2020
想要的效果,将输出保存到文件的第一行
Mon Aug 31 00:40:30 UTC 2020
Mon Aug 31 00:40:29 UTC 2020
Mon Aug 31 00:40:28 UTC 2020
Mon Aug 31 00:40:27 UTC 2020
提前致谢!
答案1
要将日期写入的开头而不是结尾file
,请尝试:
{ date; cat file; } >file.new && mv file.new file
讨论
答案2
尝试使用sed
:
sed -i "1 i\
$(date)" test.txt
形式man
:
i \
text 插入文本,每个嵌入的换行符前面都有一个反斜杠。
答案3
反转行的顺序
ex -s +%g/^/m0 +wq file
ex -s
vim 编辑器模式,相当于vim -nes
+wq
命令保存并退出
或 bash
tac <<<$(<file) >file
<<<$(<file)
这个设计作为一个自制的缓冲区
写入第一行
cat <<<$(date)$'\n'$(<file) >file
echo -e "$(date)\n$(<file)" >file
和
ex -s +'0r!date' +wq file
抱歉,一开始我没听清楚
答案4
命令
echo `date` > test.txt
截断文件 test.txt 并写入其中
虽然命令
echo `date` >> test.txt
写入附加到末尾的文件
shell 中没有一种方法可以在末尾不写入的情况下进行写入(无论是通过首先截断还是通过追加)。
行只是一堆带有分隔符的文件。在前面添加一行需要重写整个文件。但是,可以打开文件进行读写并覆盖现有字节。尽管 shell 没有为您提供直接的接口,但您可以使用例如dd
来获得这样的效果:
date | dd of=test.txt conv=notrunc
这个会代替与当前日期的第一次约会。另请注意,我们利用它以固定宽度的格式输出,*因此我们只是替换第一条记录。否则,如果每行的长度不同,我们可能会在文件开头写入旧行的部分结尾。
(*) 请注意,如果时区发生变化,长度也会发生变化。特别是从夏令时更改为夏令时时。date -R
将是一种更稳定的格式。