输出

输出

我需要 awk 在以下情况下返回退出代码 1:

  • 没有提供从 grep 到 awk 的输入
  • 第二个字段为空或不存在

当 grep 找到“SOME_PHRASE”时它正在工作,但如果该短语不存在,则返回码($?)为 0。

grep -m1 -i '^SOME_PHRASE' test.txt | awk '{ if (length($val)==0 || $val=="" || length($2)==0) exit 1; else print $2; }'

测试.txt 的示例

Test1 1234  
Phrase 214324

预期输出:

$ echo $?  
1

答案1

你确实可以结合awkgrep

awk 'BEGIN{rv=1}                      # Default return value is 1
     tolower($0) ~ /^some_phrase/{    # Case insensitive search 
         if($2 != ""){                # If $2 is not empty,
            print $2                  # print the value,
            rv=0                      # and set the return value
         } 
         exit                         # one match, do not process any more line 
     } 
     END{exit rv}
' test.txt

答案2

我成功实现了我想要的目标。

grep -m1 -i 'SOME_PHRASE' test.txt | awk 'END { if (NR==0 || $2=="")  exit 1; else print $2;}'

答案3

更直接:

$ awk 'toupper($1) ~ /^SOME_PHRASE/ { if ($2) { print $2; exit 0 } else { exit 1 } } END { exit 1 }' test.txt

第一个字段更改为大写并与大写模式进行比较。如果匹配,并且存在第二个字段,则将打印该字段,并且脚本以零退出状态退出,否则(无第二个字段)它将以退出状态 1 退出。如果模式从不匹配,则脚本退出一旦到达输入末尾,就会以退出状态 1 退出。

答案4

您应该考虑将所有内容移至一个屋顶/工具内以使其简单:

grep -qE '^SOME_PHRASE.*[^[:space:]]' yourfile

perl -0777ne 'exit !/^SOME_PHRASE.*?\S/m' yourfile

sed -ne '/^SOME_PHRASE.*[^[:space:]]/q;$q1' yourfile

输出

对于显示的数据,在运行上述任一命令后,我们立即运行:

echo "$?"
1

简短的

Perl slurps整个文件并在行的开头查找关键字,该关键字是multiline使用//m修饰符为字符串启用的。这是为了解释in & worlds 是互补的!事实。SUCCESSPerlUnix

Seddon't print unless asked for在模式下运行-n并假设GNU sedq命令也包含退出状态。

相关内容