如何修改awk递归搜索脚本,改用文件中的多行模式进行检索?
递归多模式文本检索脚本实现
最终可执行脚本
#!/bin/bash PATTERN_FILE="./patterns.txt" # 检查模式文件是否存在 if [ ! -f "$PATTERN_FILE" ]; then echo "错误:模式文件 $PATTERN_FILE 不存在" exit 1 fi find . -type f -name "*.txt" ! -name "patterns.txt" -exec awk -v pat_file="$PATTERN_FILE" ' BEGIN { # 读取所有模式存入数组 while ((getline line < pat_file) > 0) { patterns[line] = 1 } close(pat_file) } { # 检查当前行是否匹配任一模式 for (pat in patterns) { if ($0 ~ pat) { print FILENAME " : " $0 break } } } ' {} +
脚本说明
- 模式文件检查:脚本启动时先确认
patterns.txt存在,避免无意义执行 - 文件筛选:
-name "*.txt"限定仅检索.txt后缀文件! -name "patterns.txt"直接排除模式文件本身,符合需求-exec ... {} +批量传递文件给awk,比逐个处理更高效
- Awk核心逻辑:
BEGIN块提前读取所有模式到数组,避免重复打开模式文件- 遍历每个文件的每一行,匹配到任一模式后立即按
文件名 : 匹配内容格式输出,break避免同一行匹配多模式时重复输出
之前尝试的问题分析
- 第一个命令:硬编码单个搜索模式,未排除
patterns.txt,且不支持多模式检索 - 第二个命令:错误地将
patterns.txt作为待检索文件传给awk,且awk脚本未正确读取模式规则,导致输出全部文件内容
使用方法
- 将上述脚本保存为
search_patterns.sh - 赋予执行权限:
chmod +x search_patterns.sh - 确保
patterns.txt与脚本在同一目录(或修改脚本中PATTERN_FILE的路径) - 运行脚本:
./search_patterns.sh
内容的提问来源于stack exchange,提问作者Kalasni
相关产品推荐
相关产品推荐

