我尝试用">"替换现有文件符号,但它最终与空文件,有人可以帮我检查我的代码吗?
$ 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
答案 0 :(得分:1)
您无法在单个shell命令中读取和写入同一文件,因为>
会截断输出文件(即,在本例中也是输入文件)在执行命令之前。
在这种情况下的习惯习惯是做类似的事情:
... inputfile > /tmp/tmp$$ && mv /tmp/tmp$$ inputfile
换句话说:输出到中间临时文件,然后,如果前面的命令成功(&&
),则替换原始文件。
请注意,当您只是重新创建与原始文件同名的文件时会有一些陷阱:如果原始文件是符号链接,则链接会丢失,如果原始文件具有特殊权限,他们迷路了... ...
应用于相关命令,我们得到:
grep "ERROR" error | grep -v "Login errors" > /tmp/tmp$$ && mv /tmp/tmp$$ error