linux - 搜索一个词并计算它在文件中的出现次数

标签 linux shell unix

我想搜索 3 个词并计算它们在数十个文件中的出现次数。这些文件名包含前缀 + 时间戳,如 FTM.FC102.20160623183001.20160623184500 我想在他们身上搜索以下单词:Date OK RETRY DROP 然后将他们的计数放入新文件中。所需的输出应该是这样的:

    filename      OK    RETRY   DROP
    =================================
    XXX20160622XXX  221    305      400 //those values are the count of words
    .......   ... ...         ...   

我尝试了以下方法:

fileName=$(date --date="-1 day" +"%Y%m%d")
cd /advdata/ticketdatashareA/FTM_Sms/
format=*`echo $fileName`*
for i in $format;
do
 if [[ "$i" == "$format" ]]
 then
    echo "No Files"
 else
    echo -n "file name $i :" | cut -c21-49 ; echo  '\t' `grep OK $i | wc -l`; echo  '\t' `grep "RETRY" $i | wc -l`; echo  '\t' `grep "DROP" $i | wc -l`;
 fi
done

我得到的是:

20160623134501.20160623140000
\t 107
\t 0
\t 0

最佳答案

这是 Bash 的解决方案:

declare -a words=( OK RETRY DROP )

echo "filename" "${words[@]}" | tr ' ' '\t'   # added in late edit

for file in FTM.FC102.*; do
    printf "$file "
    for word in "${words[@]}"; do
        grep -o "$word" "$file" | wc -l | tr '\n' ' '
    done
    echo
done | rs 0 $(( ${#words[@]} + 1 )) # alternatively:  | tr -s ' ' '\t'

解释:

  • 我们将要查找的单词存储在数组 words 中。
  • 遍历文件(更改模式以满足您的需要)。
  • 对于每个文件,我们构造一行以文件名开头,然后...
  • 对于每个单词,grep -o 在文件中获取所有匹配项。
  • 计算匹配项的数量(使用 trwc 的输出末尾删除换行符)。
  • 在该行的末尾,发出一个带有空 echo 的换行符以结束该文件的输出行。
  • 将所有内容通过管道传输到 rs 以很好地格式化列。此实用程序至少在 BSD 系统上可用...如果您没有,只需删除管道并使用不稳定的列,或使用 | tr -s ' ' '\t' 相反,它的工作还算不错。

虽然不打印标题。

有两个文件,内容如下:

$ cat text1
Neque porro quisquam est qui dolorem ipsum quia dolor sit amet,
consectetur, adipisci velit...

$ cat text2
There is no one who loves pain itself, who seeks after it and wants to
have it, simply because it is pain...

...以及“单词”abc,脚本执行以下操作:

$ bash script.sh
text1  4      0      3
text2  7      1      1

关于linux - 搜索一个词并计算它在文件中的出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38000612/

相关文章:

linux - mv 命令有 scp 变体吗?

linux - Shell 上的 BCP 命令(.sh 文件)

python - Popen.communicate() 抛出 OSError : "[Errno 10] No child processes"

bash - 使用 cp 复制文件时保留目录树

linux - 如何在多行而不是单行输出上打印 linux 组名

linux - 如何编写一个shell脚本来添加两个数字?

linux - 如何以最快的速度复制文件?

linux - 制作脚本回答 svn+ssh passkey

linux - 为什么我的 shell 脚本会在这个文件中放入任意数字?

c - 段错误 - 自定义 Shell