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 currentif no song is playingの出力は空の文字列だと思います。

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 ブロックはプレースホルダー テキストを出力します。(私はもともとこれ専用の変数を持っていましたが、組み込みの行番号変数NRは、Bob Vale の回答で使用されているように、明らかによりエレガントです。読み取り入力行ごとにインクリメントされ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 に答える