如果字符串为空,则使用AWK打印指定的文本

时间:2012-06-27 08:27:59

标签: string awk

如果字符串为空,我正在尝试使用awk打印特定文本。它适用于以下情况

noob@noob:~$ echo "" | awk '{if ($0=="") print "not playing"}'
not playing

但是当我尝试在下面的情况下采取类似的方法时,它不起作用

noob@noob:~$ mpc current | awk '{if ($0=="") print "not playing"}'
noob@noob:~$ 

我相信如果没有播放歌曲,mpc current的输出是一个空字符串。

noob@noob:~$ mpc current
noob@noob:~$              #empty string

那么,我对empty string的假设是错误的吗?

3 个答案:

答案 0 :(得分:7)

显然它什么都没打印,甚至没有换行。试试这个。

mpc current | awk '{ print } END { if (!NR) print "not playing" }'

这会打印任何输出。如果您不想这样,请取出{ print }

awk依次处理每一行,然后在EOF执行任何END块。如果没有输入行,则在开始时将有一个EOF权限,变量NR将为零,因此END块将打印占位符文本。 (我最初有一个专用的变量,但是在Bob Vale的答案中使用的内置行号变量NR显然更优雅。对于awk读取的每个输入行,它会递增。)

答案 1 :(得分:3)

尝试

mpc current | awk 'END { if (NR==0) print "not playing"}'

答案 2 :(得分:3)

这真的是awk的工作吗?在我看来就像行计数的简单问题:

mpc current | if [[ $(wc -L) -eq 0 ]]; then echo "not playing"; fi

以上代码按mpc current计算最长行输出的长度,如果是not playing,则打印“0”。

以下是它的表现:

$ echo ""       | if [[ $(wc -L) -eq 0 ]]; then echo "not playing"; fi
not playing
$

$ echo -n ""    | if [[ $(wc -L) -eq 0 ]]; then echo "not playing"; fi
not playing
$

$ echo "foo"    | if [[ $(wc -L) -eq 0 ]]; then echo "not playing"; fi
$

$ echo -n "foo" | if [[ $(wc -L) -eq 0 ]]; then echo "not playing"; fi
$

正如William Pursell在评论中所说,你也可以这样做:

mpc current | grep -q . || echo "not playing"

这也不需要bash