如何将 shell stdout 重定向到文件的第一行?

如何将 shell stdout 重定向到文件的第一行?

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

讨论

  1. 在文件开头添加新文本需要重写整个文件。将新文本添加到文件末尾只需写入新文本。

  2. 安迪道尔顿的建议是像平常一样附加到文件末尾,然后使用它tac file来查看文件,这是一个很好的建议。

  3. echo `date` >> test.txt可以用更简单、更高效的方式代替date >> test.txt

    如果使用的是 bash 4.3 或更高版本,则如下查尔斯·达菲指出,printf '%(%c)T\n' -1 >>test.txt仍然更有效。

  4. 大括号周围的空格至关重要。这是因为{}都是 shell保留字(相对于外壳关键词不需要空格)。

答案2

尝试使用sed

sed -i "1 i\
$(date)" test.txt

形式man

i \
text 插入文本,每个嵌入的换行符前面都有一个反斜杠。

答案3

反转行的顺序

ex -s +%g/^/m0 +wq file

ex -svim 编辑器模式,相当于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将是一种更稳定的格式。

相关内容