O motivo pelo qual você obtém 3
aqui já foi explicado, mas para adicionar um pouco mais sobre a questão no assunto:
Pela definição estrita (POSIX) do termo, uma linha de texto é sempre terminada por um caractere de nova linha, então contar o número de caracteres de nova linha é o mesmo que contar o número de linhas.
Às vezes, no entanto, você encontra arquivos que possuem dados após a última nova linha (normalmente, arquivos que não são de texto provavelmente o fazem). A saída de printf foo
(o mesmo que echo -n foo
ou echo 'foo\c'
dependendo da implementação echo
) por exemplo, não contém nenhuma linha porque foo
não é terminado por um caractere de nova linha.
O comportamento dos utilitários de texto ( wc
não é um utilitário de texto) não é especificado por POSIX nesse caso (um arquivo que termina em um caractere diferente de nova linha não é um arquivo de texto). Existem algumas implementações de utilitário que tratam esses caracteres extras como uma linha extra, alguns que os ignoram, alguns podem emitir uma mensagem de aviso. Entre os que o tratam como uma linha extra, alguns adicionarão a nova linha que falta, alguns outros não.
O que isso significa é que wc -l
não necessariamente lhe dará o mesmo resultado de coisas como sed -n '$='
ou awk 'END{print NR}'
ou grep -c '^'
.