You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"

优化说明

  1. awk的分隔符从@|@简化为@,两者作用完全一致,用单个@分割字符串更简洁。
  2. 将echo $pattern1 one移到if判断内部,只有当提取到有效内容时才执行输出。
  3. 给echo的内容加上双引号,确保如果提取的内容包含特殊字符时,能正常输出。

执行修改后的脚本,即可得到符合预期的输出。

内容的提问来源于stack exchange,提问作者Rajasekhar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 18:20:00