【发布时间】:2015-06-11 07:41:11
【问题描述】:
我正在尝试编写一个脚本来计算文件列表中某些模式的匹配次数并输出其结果。本质上我想这样调用命令:
count-per-file.sh str_needle *.c
并获得如下输出:
Main.c: 12
Foo.c: 1
脚本:
#!/bin/bash
# Count occurences of pattern in files.
#
# Usage:
# count-per-file.sh SEARCH_PATTERN GLOB_EXPR
for file in "$2"; do
count=$(grep -a "$1" "$file" | wc -l)
if [ $count -gt 0 ]; then
echo "$file: $count"
fi
done
问题是如果我这样称呼它,所以我不知道如何遍历文件列表,所以这不会输出任何内容:
count-per-file.sh str_needle *.c
我找到了this answer,但它处理 glob 模式是脚本的唯一参数,而在我的脚本中,第一个参数是搜索模式,其余的是从 glob 扩展的文件。
【问题讨论】:
-
如果你把它称为
count-per-file.sh str_needle *.c,那么第二个参数就不是*.c;您的 shell 会将其扩展为Main.c和Foo.c(作为第二个和 第三个 参数s)。 -
@Biffen 对,如果我的第一个参数始终是 search_pattern,我将如何遍历这些文件?
-
shift,然后是for file。你知道grep -oc str_needle *.c做你想做的事,对吧?grep ...|wc -l不会给你出现的次数,而只是行数? -
shift然后for file in "$@" -
我会继续阅读
shift谢谢。grep命令类似,但它列出了所有文件,即使没有匹配项,而我的脚本仅列出至少有一个匹配项的文件。