我需要 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
你确实可以结合awk
和grep
:
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 是互补的!
事实。SUCCESS
Perl
Unix
Sed
don't print unless asked for
在模式下运行-n
并假设GNU sed
其q
命令也包含退出状态。