grep 多个字符串,计算行数,每个字符串的回显输出

grep 多个字符串,计算行数,每个字符串的回显输出

我有一个结构如下的文件目录:

data/directory1/file1.xml
data/directory2/file2.xml
data/directory3/file3.xml
...

data/ 中有数千个子目录,每个子目录都有一个 xml 文件。

我想递归地扫描 data/ 并查找三个模式,然后在每个模式之前使用标签回显模式匹配的计数(理想情况下)。所以,对于我的输出,我想看到

Pattern 1 = 20
Pattern 2 = 100
Pattern 3 = 432

我已经能够使用它一次运行这些:

grep -E -r 'Pattern 1' data/ | wc -l
grep -E -r 'Pattern 2' data/ | wc -l
grep -E -r 'Pattern 3' data/ | wc -l 

现在我试图将这一切放入带有一个参数的 shell 脚本中,该参数将是 data/ 的父目录。然后将每个模式的计数输出到标准输出或 count.txt。

感谢您的帮助!

答案1

您应该检查一下grep -c,它确实符合您的描述。如果您需要更大的灵活性,您可能可以使用awk.尝试这样的事情(直接在浏览器中输入,未测试):

dir=$1
# add tests to check if $1 exists (-d) and/or is non null (-n)

find "${dir}" | awk <<\EOF

BEGIN {
   pat1 = 0;
   pat2 = 0;
   ...
}

/pattern/ { pat1 += 1;}
/otherpattern/ {pat2 += 2;}
...

END {
   print "pattern", pat1;
   print "otherpattern", pat2;
   ...
}
EOF

我将让您自行确定find命令或awk脚本的详细信息。

答案2

以下脚本循环该模式并打印每个模式的匹配总数。它在名称作为参数传递的目录下搜索,如果不传递参数,则在当前目录下搜索。

#!/bin/sh
for p in 'Pattern 1' 'Pattern 2' 'Pattern 3; do
  printf '%s = ' "$p"; grep -E -r -e "$p" "${1:-.}/data" | wc -l
done

相关内容