Shell 如何在unix中打印文件中某个单词的出现次数

Shell 如何在unix中打印文件中某个单词的出现次数,shell,unix,Shell,Unix,这是我的shell脚本。 给定一个目录和一个单词,搜索该目录并打印该单词出现次数最多的文件的绝对路径,同时打印出现次数。 我写了以下脚本 #!/bin/bash if [[ -n $(find / -type d -name $1 2> /dev/null) ]] then echo "Directory exists" x=` echo " $(find / -type d -name $1 2> /dev/null)"` echo "$x" cd $

这是我的shell脚本。 给定一个目录和一个单词,搜索该目录并打印该单词出现次数最多的文件的绝对路径,同时打印出现次数。 我写了以下脚本

#!/bin/bash

 if [[ -n $(find / -type d -name $1 2> /dev/null) ]]
 then
  echo "Directory exists"

   x=` echo " $(find / -type d -name $1 2> /dev/null)"`
   echo "$x"
   cd $x
   y=$(find . -type f | xargs grep -c  $2  | grep -v ":0"| grep -o '[^/]*$' | sort -t: -k2,1 -n -r ) 
   echo "$y"
   else 
   echo "Directory does does not exists"
 fi   


 result: scriptname directoryname word
 output: /somedirectory/vtb/wordsearch : 4
         /foo/bar: 3
有没有替代xargs grep-c$2的选项?因为grep-c打印count=包含单词的行数,但我需要打印给定目录中文件中单词的确切出现次数

请尝试以下操作:

grep -Fwor "$word" "$dir" | sed "s/:${word}\$//" | sort | uniq -c | sort -n | tail -1
grep -o -w 'foo' bar.txt | wc -w


使用grep的
-c
计数功能:

grep -c "SEARCH" /path/to/files* | sort -r -t : -k 2 | head -n 1

grep命令将以
/path/name:count
格式输出每个文件,排序将按第二个(
-k2
)字段(由冒号(
-t:
)以相反顺序(
-r
)进行数字(
-n
)排序。然后我们使用head保存第一个结果(
-n1
)。

运行两次find命令是错误的
x=`echo“$(find…)`
可以是
x=$(find…)
。像这样抓取find的输出对于带有空格或其他特殊字符的文件是不安全的。如果我删除它,它就不工作了。怎么会这样?包装
echo
和额外的子shell没有任何作用。sed在做什么,我不知道{word}表示什么
grep-o-r
输出文件名、冒号和您要查找的单词。sed
sed
删除了冒号和单词——我并不是假设每个文件名都没有冒号。它只打印给定文件中单词出现的次数。但是我需要打印文件名和计数。它会在当前目录中递归搜索包含给定单词的文件吗?因为我没有为文件指定任何路径。很抱歉,我不能运行命令并检查,因为我在家,所以想澄清我的疑问
grep-c
仅统计包含图案的行,而不是每行出现一次以上的所有图案。
grep -c "SEARCH" /path/to/files* | sort -r -t : -k 2 | head -n 1