while read循环未过滤非匹配awk模式行的问题求助
问题:提取@包裹内容时输出多余空行的解决办法
场景说明
需要从testfile.txt中提取@符号之间的内容,但执行现有脚本后,不含@的行也会输出one单独一行,不符合预期输出要求。
相关文件与脚本
testfile.txt 内容
## START :: start of file ## path.mw.site.profiles=@mysite.mw_path@ # path.mw.site.broker.profiles=@mysite.mw_brkr_path@ # path.mw.site.profiles=@mysite.mw_path@ # path.mw.site.broker.profiles=@mysite.mw_brkr_path@ ## END :: end of file ##
原执行脚本 test_script.sh
#!/bin/bash while IFS= read -r line; do pattern1=$(echo "$line" | awk -F '@|@' '{print $2}') echo $pattern1 one if [ ! -z "$pattern1" ]; then echo "pattern is not empty" fi done < "$1"
当前实际输出
raj@my_server ~]$ ./test_script.sh testfile.txt one mysite.mw_path one pattern is not empty one mysite.mw_brkr_path one pattern is not empty one mysite.mw_path one pattern is not empty one mysite.mw_brkr_path one pattern is not empty one
预期输出
mysite.mw_path one pattern is not empty mysite.mw_brkr_path one pattern is not empty mysite.mw_path one pattern is not empty mysite.mw_brkr_path one pattern is not empty
解决办法
问题根源
对于不含@的行,pattern1会是空字符串,但原脚本不管pattern1是否为空,都会执行echo $pattern1 one,这就导致了多余的one单独行。
修改后的脚本
#!/bin/bash while IFS= read -r line; do pattern1=$(echo "$line" | awk -F '@' '{print $2}') # 分隔符简化为@,效果相同 if [ ! -z "$pattern1" ]; then echo "$pattern1 one" # 加双引号避免特殊字符解析问题 echo "pattern is not empty" fi done < "$1"
优化说明
- awk的分隔符从
@|@简化为@,两者作用完全一致,用单个@分割字符串更简洁。 - 将
echo $pattern1 one移到if判断内部,只有当提取到有效内容时才执行输出。 - 给
echo的内容加上双引号,确保如果提取的内容包含特殊字符时,能正常输出。
执行修改后的脚本,即可得到符合预期的输出。
内容的提问来源于stack exchange,提问作者Rajasekhar
相关产品推荐
相关产品推荐

