我有一个结构如下的文件目录:
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