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

时间:2011-07-19 03:23:22

标签: bash search

以此代码为例。假装它是一个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 

5 个答案:

答案 0 :(得分:129)

使用带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 :(得分:76)

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

grep -c "echo" FILE

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

编辑:

在玩了一下之后,你可以使用这个脏的一点代码来获取出现次数:

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

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

答案 2 :(得分: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

答案 3 :(得分:0)

如果您只想要出现的次数,则可以执行此操作, $ grep -c“ string_to_count”文件名

答案 4 :(得分: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

所以我写了a very simple Rust program to do it

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

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