如何向grep传递多文件模式及bash数组中的搜索模式
如何向grep传递多文件模式及bash数组中的搜索模式
看起来你已经搭好了基本框架,但代码里有两个小问题导致没法正常工作,我来帮你修正并把关键细节讲清楚:
首先先指出原代码里的问题:
- 循环里的文件名变量写错了:你用了
$flnm但循环变量是fl,变量名不统一会导致grep找不到目标文件; - 数组模式传递方式错误:直接写
"$ptrn"只会把数组的第一个元素传给grep,后面的模式会被完全忽略。
修正后的完整代码
# 定义存储搜索模式的数组 ptrn=("FN" "DS") # 可选:定义颜色控制变量(用来美化文件名输出,不需要可以删掉) mgn=$(tput setaf 5) rst=$(tput sgr0) # 遍历命令行传入的所有文件参数 for fl in "$@"; do if [[ -f "$fl" ]]; then # 打印带颜色的文件名分隔提示 printf '\n%s%s%s\n\n' "$mgn" "==> $fl <==" "$rst" # 正确传递数组中的所有搜索模式给grep grep --color=auto -e "${ptrn[@]}" "$fl" fi done
关键细节解释
数组模式的正确传递:
grep的-e选项用来指定单个搜索模式,当需要匹配多个模式时,每个模式都需要搭配一个-e。这里的"${ptrn[@]}"会把数组的每个元素作为独立参数展开,最终grep命令会被解析成:grep --color=auto -e FN -e DS "目标文件名"这样grep就会匹配文件中任意一个模式对应的行。
变量名的修正:
把原代码里的$flnm全部替换成$fl,因为循环是把命令行传入的每个文件路径存到fl变量里,未定义的flnm会导致grep报错找不到文件。颜色输出的优化:
把--color改成--color=auto,这样grep只会在输出到终端时才添加颜色控制符,如果把结果重定向到文件,就不会混入无用的颜色代码,更实用。
可选优化(按需使用)
如果你的搜索模式是固定字符串(不是正则表达式),可以加上-F选项让grep按纯字符串匹配,不仅避免正则表达式的特殊字符干扰,还能提升匹配速度:
grep --color=auto -F -e "${ptrn[@]}" "$fl"
备注:内容来源于stack exchange,提问作者Fatipati
相关产品推荐
相关产品推荐

