3

我正在尝试使用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 错误的吗?

4

3 回答 3

10

显然它根本不打印任何内容,甚至没有换行符。试试这个。

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

这将打印任何输出。如果你不想这样,请取出{ print }.

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

于 2012-06-27T08:46:12.143 回答
4

尝试

mpc current | awk 'END { if (NR==0) print "not playing"}'
于 2012-06-27T08:46:52.953 回答
3

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

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

上面的代码计算了输出的最长行的长度,如果是则mpc current打印“ ” 。not playing0

以下是它的行为方式:

$ 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

于 2012-06-27T09:07:36.043 回答