在bash脚本中替换现有文件

时间:2016-03-18 01:24:19

标签: linux bash replace terminal grep

我尝试用">"替换现有文件符号,但它最终与空文件,有人可以帮我检查我的代码吗?

$ grep -c "ERROR" server.log.2016-03-15 
633
$ grep "ERROR" server.log.2016-03-15 >error 
$ grep -c "ERROR" error 
633
$ grep -c "Login errors" error 
95
$ grep "ERROR" error | grep -v "Login errors" >error
$ grep -c "ERROR" error 
0

1 个答案:

答案 0 :(得分:1)

您无法在单个shell命令中读取和写入同一文件,因为>会截断输出文件(即,在本例中也是输入文件)在执行命令之前。

在这种情况下的习惯习惯是做类似的事情:

... inputfile > /tmp/tmp$$ && mv /tmp/tmp$$ inputfile

换句话说:输出到中间临时文件,然后,如果前面的命令成功(&&),则替换原始文件。

请注意,当您只是重新创建与原始文件同名的文件时会有一些陷阱:如果原始文件是符号链接,则链接会丢失,如果原始文件具有特殊权限,他们迷路了... ...

应用于相关命令,我们得到:

grep "ERROR" error | grep -v "Login errors" > /tmp/tmp$$ && mv /tmp/tmp$$ error