Shell 统计文件中出现的字符串数

Shell 统计文件中出现的字符串数,shell,Shell,我试图使用shell脚本计算文件中某一行的出现次数。该文件的内容是: 2019年12月23日星期一06:21:00[pid 3294][ftpuser]FTP响应:客户端“127.0.0.1”,“230登录成功。” 2019年12月23日星期一06:21:00[pid 3294][ftpuser]FTP响应:客户端“127.0.0.1”,“230登录成功。” 2019年12月23日星期一06:21:00[pid 3294][ftpuser]FTP响应:客户端“127.0.0.1”,“230登录成

我试图使用shell脚本计算文件中某一行的出现次数。该文件的内容是:

2019年12月23日星期一06:21:00[pid 3294][ftpuser]FTP响应:客户端“127.0.0.1”,“230登录成功。”

2019年12月23日星期一06:21:00[pid 3294][ftpuser]FTP响应:客户端“127.0.0.1”,“230登录成功。”

2019年12月23日星期一06:21:00[pid 3294][ftpuser]FTP响应:客户端“127.0.0.1”,“230登录成功。”

2019年12月23日星期一06:21:00[pid 3294][ftpuser]FTP响应:客户端“127.0.0.1”,“230登录成功。”

shell脚本代码为:

file="vsftpd1.log"
count=0
while read str; do
  echo $str
  if [[ $str == *"230 Login successfull."* ]]; 
  then 
      count=$((count+1))
  fi
done < $file
echo $count
file=“vsftpd1.log”
计数=0
读str时;做
echo$str
如果[[$str==*“230登录成功。”*];
然后
计数=$((计数+1))
fi
完成<$file
echo$count
最后一行的输出应该是4。我注意到如果条件只执行一次。但它应该运行四次。请帮我找出代码中的错误,如果有。
提前谢谢你

您可以使用
grep
(匹配发生次数)及其
-c
(计数发生次数)来简化这一过程

如果需要将数字捕获到变量中:

count=$(grep -c '230 Login successfull.' "$file")
echo $count
整个(相当低效)代码片段可以用更简单的代码替换:

count=$(grep -c '230 Login successfull.' vsftpd1.log)
echo ${count}
作为进一步解释,
grep-c
返回与搜索模式匹配的行数。不需要基于
bash
的循环,它一次读取一行并检查模式-这在
grep
可执行文件中可能要快得多


下面的文字记录显示了这一点:

pax:~$ grep '230 Login successfull.' qq.in
Mon Dec 23 06:21:00 2019 [pid 3294] [ftpuser] FTP response: Client "127.0.0.1", "230 Login successfull."
Mon Dec 23 06:21:00 2019 [pid 3294] [ftpuser] FTP response: Client "127.0.0.1", "230 Login successfull."
Mon Dec 23 06:21:00 2019 [pid 3294] [ftpuser] FTP response: Client "127.0.0.1", "230 Login successfull."
Mon Dec 23 06:21:00 2019 [pid 3294] [ftpuser] FTP response: Client "127.0.0.1", "230 Login successfull."

pax:~$ count=$(grep -c '230 Login successfull.' qq.in) ; echo ${count}
4

在这里工作很好,我不能重现这个问题实际上这是我使用shell脚本的第一天,我对此一无所知。你能告诉我在我的代码中你的解决方案的第二行在哪里使用吗?grep有
-c
开关,wc不需要编辑仍在给出一个。我在循环中使用了这条线@VipulTyagi您不需要循环-命令执行文件读取themselves@oguzismail你完全正确:)我编辑了答案。没有,仍然给出一个!!请帮帮我我对大代码没有问题。但它应该work@VipulTyagi当前位置如果只给出一条,那么我建议只有一条线具有该模式。我的建议是重新检查文件内容,因为根据我添加的成绩单,它可以正常工作。你真的应该对大型(同样重要的是,低效)代码有问题,这就是作为一个工匠的意义所在,为你的工作产品感到自豪:-)
pax:~$ grep '230 Login successfull.' qq.in
Mon Dec 23 06:21:00 2019 [pid 3294] [ftpuser] FTP response: Client "127.0.0.1", "230 Login successfull."
Mon Dec 23 06:21:00 2019 [pid 3294] [ftpuser] FTP response: Client "127.0.0.1", "230 Login successfull."
Mon Dec 23 06:21:00 2019 [pid 3294] [ftpuser] FTP response: Client "127.0.0.1", "230 Login successfull."
Mon Dec 23 06:21:00 2019 [pid 3294] [ftpuser] FTP response: Client "127.0.0.1", "230 Login successfull."

pax:~$ count=$(grep -c '230 Login successfull.' qq.in) ; echo ${count}
4