awk未匹配内容时无输出的问题排查及解决求助
问题:Bash脚本中用awk查找字段,无匹配时无输出的原因及解决
问题场景
在Bash脚本中尝试用awk查找文件指定字段,匹配存在时能正常输出统计信息,但匹配不存在时无任何输出,需定位问题并解决。
原测试脚本(problems.sh)
#!/bin/bash #what happens awk finds nothing check(){ (awk '$0 =="milk" {print $1}' trial.txt \ | uniq -c \ | awk '{ if ($1 > 1) \ print $1 ,"record found"; \ else if($1 == 1) print $1, "record of " $2 ,"found"; else if($1 == "")\ print "no record of " $2 ,"found";\ else if(length($1) == 0) print "no record of " $2 , "found";\ else print "nothing happened here" }') } echo "what happens when awk finds nothing" check
测试文件(trial.txt)
choco milk ginger bread milk apple
现象
- 查找
milk时输出正常:what happens when awk finds nothing 2 record found - 查找
fire时仅输出开头提示,无后续结果:what happens when awk finds nothing
问题原因
当第一个awk '$0 =="fire" {print $1}' trial.txt未匹配到任何内容时,不会产生任何输出,导致后续的uniq -c无输入可处理,自然也不会输出内容。第二个awk没有处理对象,你写的空值判断逻辑根本没有执行机会,最终无输出。
解决方案
简化逻辑,用单awk命令完成计数、判断和输出,避免管道无输入的问题:
修改后的脚本
#!/bin/bash check() { local target="$1" awk -v t="$target" ' $0 == t { count++ } END { if (count > 1) { print count, "record found" } else if (count == 1) { print count, "record of", t, "found" } else { print "no record of", t, "found" } }' trial.txt } echo "what happens when awk finds nothing" check "fire"
说明
- 用
-v t="$target"将Bash变量传递给awk,避免硬编码目标字符串,提升灵活性 - 在awk的
END块中统一处理计数结果:- 匹配多次时输出对应统计
- 匹配1次时输出对应提示
- 未匹配时(count为0)输出无记录提示
- 移除多余管道和子shell,逻辑更清晰,执行效率更高
测试结果
- 查找
milk时输出:what happens when awk finds nothing 2 record found - 查找
fire时输出:what happens when awk finds nothing no record of fire found
内容的提问来源于stack exchange,提问作者Bethel-m
相关产品推荐
相关产品推荐

