在给定的git仓库的分支中,计算所有文件中所有行的出现次数

rn0zuynd  于 2024-01-04  发布在  Git
关注(0)|答案(3)|浏览(147)

我可以通过以下命令在git仓库的一个分支中找到包含“my string”模式的所有行

git grep "my string" my_branch

字符串
比如,它的结果是
my_分支:file 1:file 1什么是“my string"?
my_分支:file 2:file 2 Hello,“my string”就是“my string"!
我们在两个文件的两行中看到了3次。我可以通过

git grep "my string" my_branch | wc -l


这将导致
2
问题是如何得到字符串在给定分支中所有文件中出现的确切次数?是否可以运行一些命令或脚本,在我的示例中给出3,而不是2

z9gpfhce

z9gpfhce1#

-o选项是在2.19中引入的。在以前的版本中,您可以使用git show并将其与标准grep调用合并组合:

$ git show my_branch | grep -o 'my string' | wc -l

字符串

ws51t4hk

ws51t4hk2#

您可以在grep中使用-o选项来满足您的需求,并将其传递给wc -l以进行计数:
man grep内部:

-o, --only-matching
              Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line.

字符串
这应该对你有用:
git grep -o "my string" my_branch | wc -l
请注意,要使用-o选项,git版本必须为2.18或更高版本。

nwlqm0z1

nwlqm0z13#

为什么grep没有给出正确的结果,因为它在每一行中寻找字符串,如果一行中出现了不止一次字符串,那么它也会将其计数为1次。

  • grep不计算同一行上多次出现的字符串的示例:*

假设我们有下面的Input_file:

cat Input_file
test my_string
la bla bla
my_string
bla bla

字符串
现在,当我们运行grep命令时,它给出如下:

grep "my_string" Input_file | wc -l
2


现在让我们把一个字符串的多次出现放在一行中:

cat Input_file
test my_string
la bla bla
my_string my_string
bla bla

grep "my_string" Input_file | wc -l
2


因此,如果允许的话,你可以尝试awk,你不需要使用2个程序(grep + wc),也为git命令采取参考@UnbearableLightness的答案在这里。

git show my_branch |awk '{sum+=gsub(/my string/,"&")} END{print sum}'

相关问题