O comando wc está contando as palavras na saída do grep, que inclui "for":
> grep shell test.txt
for shell_A
shell_B
shell_C
Então, existem 4 palavras.
Se você quiser apenas contar o número de linhas que contêm uma palavra específica em um arquivo, use a opção -c
do grep, por exemplo,
grep -c shell test.txt
Nenhum deles realmente conta palavras , mas pode combinar outras coisas que incluem string . A maioria das implementações de grep
(GNU grep, BSDs modernos, bem como AIX, HPUX, Solaris) fornece uma opção -w
para palavras, mas isso não está em POSIX. Eles também reconhecem uma expressão regular, por exemplo,
grep -e '\<shell\>' test.txt
que corresponde à opção -w
. Novamente, isso não está em POSIX. O Solaris documento , enquanto o AIX e o HPUX descrevem -w
sem mencionar a expressão regular. Todos parecem ser consistentes, tratando uma "palavra" como uma sequência de alfanuméricos mais sublinhado.
Você poderia usar uma expressão regular POSIX com grep para combinar palavras (separadas por espaços em branco, etc), mas seu exemplo não possui nenhuma que seja apenas "shell": todas elas possuem algum outro caractere tocando as correspondências. Alternativamente, se você se importa apenas com alfanuméricos (e não sublinhado) e não se importa com substrings correspondentes, você poderia fazer
tr -c '[[:alnum:]]' '\n' test.txt |grep -c shell
A opção -o
sugerida é não-POSIX, e como o OP não limitou a questão ao Linux ou BSDs, não é o que eu recomendaria. Em ambos os casos, não corresponde a palavras , mas strings (que era a expectativa do OP).
Para referência: