如何继续覆盖文件的内容而不是追加到文件中

如何继续覆盖文件的内容而不是追加到文件中

如何在写入文件之前清除文件内容?例如:

echo one > filename.tmp
# filename.tmp now contains "one"

echo two > filename.tmp
# filename.tmp should now contain "two", not "one" and "two"

我的目标是:

  1. 启动监听器

    $ nc -l 7007 > /var/tmp/test.log
    
  2. 发送一些数据

    $ telnet localhost 7007
    hi
    second_word
    
  3. 测试文件

    $ cat /var/tmp/test.log
    second_word
    

我不想让“hi”出现在日志中;我希望“second_word”取代它

答案1

您需要一个单独的程序来清除和写入新文件,因为 nc 不提供该选项。

nc -l 7007 | while true; do
    while read line; do
      echo "$line" > /tmp/test
    done
done

您可以将管道之后的所有内容保存在接受文件路径的单独脚本中。

保存最后一行.sh

while true; do
    while read line; do
        echo "$line" > $1
    done
done

那么就很简单了:

nc -l 7007 | save-last-line.sh /var/tmp/test.log

您需要添加检查以确保$1可写并在$1未指定时显示用法。

答案2

command > /path/to/file将清除该文件并将输出写入command其中。

当你想要清除该文件,它是command >> /path/to/file.

需要注意的一件事是noclobbershell 中的选项。它将阻止您使用>操作员清除文件。您可以使用替代来覆盖该选项>!,也可以使用 取消设置set +o noclobber

在命令行尝试一下:

# echo "Hello, " > /tmp/test
# cat /tmp/test
  Hello
# echo "U&L" > /tmp/test
# cat /tmp/test
  U&L
# echo "Hello," > /tmp/test
# echo "U&L" >> /tmp/test
# cat /tmp/test
  Hello,
  U&L
# 

相关内容