在与文件名相同的行上附加 grep 匹配计数

在与文件名相同的行上附加 grep 匹配计数

我想在某个目录下的所有文件中搜索特定单词/模式的匹配计数。但是,我希望数字直接出现在文件名之后。

我执行了以下操作,但它将计数写入新行而不是最后一行

grep -rc "WORD" /home/user/data >> file

实际产量

foo
12

期望的输出:

foo12

答案1

使用 时>> file,文件会以附加模式在 stdout 上打开。因此任何输出都位于文件末尾。

grep写道12\n。您的文件foo\n预先包含。所以你得到了foo\n12\n。要获得foo12\n,您不需要在末尾输出,而是在结束之前的最后一个字节输出,用 覆盖\n12\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 的文本而不换行

相关内容