如何在写入文件之前清除文件内容?例如:
echo one > filename.tmp
# filename.tmp now contains "one"
echo two > filename.tmp
# filename.tmp should now contain "two", not "one" and "two"
我的目标是:
启动监听器
$ nc -l 7007 > /var/tmp/test.log
发送一些数据
$ telnet localhost 7007 hi second_word
测试文件
$ 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
.
需要注意的一件事是noclobber
shell 中的选项。它将阻止您使用>
操作员清除文件。您可以使用替代来覆盖该选项>!
,也可以使用 取消设置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
#