Bash脚本无法将匹配邮箱写入CSV文件问题排查
脚本无法写入匹配结果的问题分析与修复
问题场景
我有输入文件users.txt,内容如下:
rajesh.kumar@company.com rhmn@company.com mkkumar@company.com manish.panday@company.com daniel.m@company.com jain@company.com abul@company.com aditi@company.com aditya.s@company.com
编写了如下Bash脚本,意图逐行读取users.txt,将与指定列表匹配的邮箱写入result.csv:
#!/bin/bash Input_file="users.txt" Output_file="result.csv" Match_list="$(command_to_get_match_user)" Email="$(echo "$Match_list" | awk -F '|' '{print $4}' | tr -d '[:space:]')" while read line; do if [[ "$line" == *"$Email"* ]]; then echo "$line" >> "$Output_file" fi done < "$Input_file"
其中command_to_get_match_user命令的输出为:
1320 | | Rajesh Kumar | rajesh.kumar@company.com | live 1584 | | A.K.M. Rahman | rhmn@company.com | live 1503 | | Mukesh Kumar | mkkumar@company.com | live 1279 | | Aayush Jain | aayush.jain@company.com | live 1597 | | Abul Hasan Md Osama | abul.osama@company.com | live 1660 | | Aditi Singpuri | aditi.singpuri@company.com | live 1570 | | Aditya Jain | aditya.jain@company.com | live
目前脚本未生成任何匹配结果写入result.csv,求问题原因及修复方案。
问题根源
Email变量取值逻辑错误
原脚本中,Email变量是把Match_list所有行的第4列(邮箱)提取后拼接成一个多行字符串。而[[ "$line" == *"$Email"* ]]的判断逻辑是检查当前行是否包含这个完整的多行字符串——这显然不可能,因此没有任何匹配。未遍历匹配邮箱列表
脚本只做了一次全局匹配判断,没有逐个检查Match_list中的每个邮箱是否存在于users.txt中。
修复方案
方案一:用数组存储匹配邮箱,遍历匹配
逻辑直观,适合理解基础循环的场景:
#!/bin/bash Input_file="users.txt" Output_file="result.csv" Match_list="$(command_to_get_match_user)" # 将所有匹配邮箱提取后存入数组,同时去除空格 readarray -t Emails < <(echo "$Match_list" | awk -F '|' '{gsub(/ /, "", $4); print $4}') # 清空输出文件,避免多次运行重复写入内容 > "$Output_file" # 遍历users.txt的每一行 while read -r line; do # 遍历每个匹配邮箱,检查是否与当前行完全一致 for email in "${Emails[@]}"; do if [[ "$line" == "$email" ]]; then echo "$line" >> "$Output_file" break # 匹配到就跳出循环,避免同一行重复写入 fi done done < "$Input_file"
方案二:用grep高效匹配(推荐)
利用grep的正则匹配能力,无需循环,处理大文件更高效:
#!/bin/bash Input_file="users.txt" Output_file="result.csv" Match_list="$(command_to_get_match_user)" # 提取所有匹配邮箱,用|拼接成grep的扩展正则模式 pattern=$(echo "$Match_list" | awk -F '|' '{gsub(/ /, "", $4); print $4}' | paste -sd '|' -) # 用grep精确匹配整行内容,结果直接写入输出文件 grep -Fx -E "$pattern" "$Input_file" > "$Output_file"
-F:将模式作为固定字符串处理,避免正则特殊字符干扰-x:只匹配整行完全一致的内容-E:启用扩展正则,支持|分隔多匹配项
额外优化点
原脚本中使用>>追加写入,多次运行会导致result.csv内容重复。修复方案中加入了清空文件的操作(> "$Output_file"或用>直接覆盖写入),确保每次运行结果都是最新的。
内容的提问来源于stack exchange,提问作者user4948798
相关产品推荐
相关产品推荐

