如何计算文件中字符串的出现次数?


77

仅以此代码为例。假设它是HTML /文本文件,如果我想知道出现的总次数,该echo如何使用bash进行处理?

new_user()
{
    echo "Preparing to add a new user..."
    sleep 2
    adduser     # run the adduser program
}

echo "1. Add user"
echo "2. Exit"

echo "Enter your choice: "
read choice


case $choice in
    1) new_user     # call the new_user() function
       ;;
    *) exit
       ;;
esac 

Answers:


96

这将输出包含搜索字符串的数。

grep -c "echo" FILE

但是,这不会计算文件中出现的次数(即,如果您在一行上多次执行echo)。

编辑:

经过一番尝试之后,您可以使用下面这些肮脏的代码来获得出现的次数:

sed 's/echo/echo\n/g' FILE | grep -c "echo"

基本上,这会在每个echo实例之后添加一个换行符,因此它们每个都在自己的行上,从而允许grep计数这些行。例如,如果您只想要单词“ echo”而不是“ echoing”,则可以优化正则表达式。


那么,如果同一行中的回波很少,该怎么办?例如。回声时间回声
Leo Chan

我已经更新了我的回复,希望该回复对您有用。
Manny D

谢谢 。再花几分钟,再问一个问题。如果我想删除echo的第三次出现。我能做什么?
李奥陈

@foodil:删除第三个回声:sed -e 's/echo//3'
约翰·卫斯理亲王

我可以在这样的变量中分配出现次数吗?:noOfTable1 = grep -c“ table_1row” /var/www/html/INFOSEC/english/news/test.html谢谢
Leo Chan

156

可以使用with选项和(字数)来获取出现的字符串数(不是line):grep-owc

$ echo "echo 1234 echo" | grep -o echo
echo
echo
$ echo "echo 1234 echo" | grep -o echo | wc -l
2

因此,针对您的问题的完整解决方案如下所示:

$ grep -o "echo" FILE | wc -l

1
我觉得这是一个简单的解决方案,不确定时间的复杂性
kishorebjv

2
请小心,如果grep认为文件是“二进制”,则每次都会从该文件中获得“ 1”输出,-a如果您愿意的话,请添加以确保安全...
rogerdpack

1

我在这里有些猜测,因为我不太了解您的要求。

我认为您想要的是对给定文件中出现模式“ echo”的行数的计数。

我已将您的示例文本粘贴到名为的文件中6741967

首先,grep找到匹配项:

james@Brindle:tmp$grep echo 6741967 
    echo "Preparing to add a new user..."
echo "1. Add user"
echo "2. Exit"
echo "Enter your choice: "

二,wc -l用来数线

james@Brindle:tmp$grep echo 6741967  | wc -l
       4

谢谢您的帮助。抱歉使您感到困惑。我的问题是计算文件中的出现次数
Leo Chan

2
如果执行grep -o echo 6741967,则将为它们每个输出一个新行,然后可以使用:grep -o echo 6741967 | wc -l,它也将在一行上说明多个“回声”
Wivlaro 2013年

0

对于单行10GB文件,现有答案均不适合我。即使在具有768 GB RAM的计算机上,Grep也会耗尽内存!

$ cat /proc/meminfo | grep MemTotal
MemTotal:       791236260 kB
$ ls -lh test.json
-rw-r--r-- 1 me all 9.2G Nov 18 15:54 test.json
$ grep -o '0,0,0,0,0,0,0,0,' test.json  | wc -l
grep: memory exhausted
0

因此,我编写了一个非常简单的Rust程序来执行此操作

  1. 安装Rust
  2. cargo install count_occurences
$ count_occurences '0,0,0,0,0,0,0,0,' test.json
99094198

这有点慢(10GB需要1分钟),但至少不会耗尽内存!


-1

如果只需要出现的次数,则可以执行此操作,$ grep -c“ string_to_count” file_name


2
无法正确计算同一行中两次出现的字符串。
乔西亚
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.