Bash逐行读取文件执行grep脚本异常,寻求故障排查方案
问题排查与修正方案
咱先拆解下你脚本里的两个核心问题,再给你修复好的版本:
1. IFS = read的语法错误
在bash里,变量赋值的=两边绝对不能加空格!你写的IFS = read会被bash当成是执行IFS命令,还把=和read当成参数传进去,这不报错才怪。正确写法是IFS= read -r line:
IFS=用来保留行首、行尾的空格(避免搜索词被意外截断)-r参数防止read解析行内的反斜杠字符,保证搜索词原样读取
2. 换行符输出的错误写法
你直接用"\n$line:\n" >> "results.txt"是没用的——bash不会把双引号里的\n解析成换行符,反而会把字符串\nsearch1:\n直接写进文件。
推荐用两种可靠的方式输出带换行的内容:
- 用
echo -e(必须加-e才能解析转义字符) - 用
printf(跨平台兼容性更好,我更推荐这个)
修正后的完整脚本
#!/usr/bin/bash # 把整个循环的输出一次性重定向到results.txt,比每次追加文件更高效 while IFS= read -r line; do # 用printf输出换行+搜索词+换行,格式稳定不翻车 printf "\n%s:\n" "$line" # 不区分大小写搜索当前目录下的所有*.in文件 grep -i "$line" *.in done < "list.txt" >> "results.txt"
额外优化小技巧
如果你的list.txt里可能有空行,可以加个判断跳过它们:
#!/usr/bin/bash while IFS= read -r line; do # 跳过空行(包括全是空格的行) [[ -z "$line" ]] && continue printf "\n%s:\n" "$line" grep -i "$line" *.in done < "list.txt" >> "results.txt"
要是想在没有匹配结果时也给个提示(比如No matches found),可以这么改:
#!/usr/bin/bash while IFS= read -r line; do [[ -z "$line" ]] && continue printf "\n%s:\n" "$line" # 判断是否有匹配结果,没有就输出提示 if grep -i "$line" *.in; then : # 匹配到内容时直接输出结果就行 else echo "No matches found" fi done < "list.txt" >> "results.txt"
内容的提问来源于stack exchange,提问作者Anubis The Coding Nooby Puppy
相关产品推荐
相关产品推荐

