我想在某个目录下的所有文件中搜索特定单词/模式的匹配计数。但是,我希望数字直接出现在文件名之后。
我执行了以下操作,但它将计数写入新行而不是最后一行
grep -rc "WORD" /home/user/data >> file
实际产量
foo
12
期望的输出:
foo12
答案1
使用 时>> file
,文件会以附加模式在 stdout 上打开。因此任何输出都位于文件末尾。
grep
写道12\n
。您的文件foo\n
预先包含。所以你得到了foo\n12\n
。要获得foo12\n
,您不需要在末尾输出,而是在结束之前的最后一个字节输出,用 覆盖\n
它12\n
。
有些 shell 有相应的操作符。
和zsh
:
zmodload zsh/system
if sysseek -u 1 -w end -1; then
grep -c WORD /home/user/data
else
syserror -p "Can't seek to just before the end: "
fi 1<> file
和ksh93
:
grep -c WORD /home/user/data 1<> file >#((EOF - 1))
<>
是以读+写模式打开文件的重定向运算符。在这里,我们不关心读部分,但我们使用<>
与 相反的方式>
,它不会截断文件。
无论如何,这都不是一个附加模式。如果其他进程也写入该文件或同时截断它,您会看到差异(在您的情况下不太可能成为问题)。
另一种方法可能是截断文件以删除尾随\n
,然后在中打开文件附加模式。
使用 GNU truncate
:
truncate -s -1 file && grep -c WORD /home/user/data >> file
答案2
您可以使用 sed 在最后一行的末尾追加:
sed -i '$ s/$/'$(grep -rc "WORD" /home/user/data)'/' file
也可以看看:附加带有 echo 的文本而不换行