以此代码为例。假装它是一个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
答案 0 :(得分:129)
使用带grep
选项的-o
和wc
(字数),可以获得字符串出现次数(不是行):
$ 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。
cargo install count_occurences
$ count_occurences '0,0,0,0,0,0,0,0,' test.json
99094198
有点慢(10GB 1分钟),但至少不会耗尽内存!