Команда wc -w выводит неверный ответ

Я должен найти, сколько раз слово shell используется в файле. Я использовал grep "shell" test.txt | wc -w grep "shell" test.txt | wc -w , чтобы подсчитать, сколько раз это слово использовалось, но результат выдается 4 вместо 3. Содержимое файла:

 this is a test file for shell_A shell_B sh shel and shell_C script project 

4 Solutions collect form web for “Команда wc -w выводит неверный ответ”

Команда wc подсчитывает слова в выходном файле grep, который включает «для»:

 > grep shell test.txt for shell_A shell_B shell_C 

Так что на самом деле есть 4 слова.

Если вы хотите только подсчитать количество строк, содержащих определенное слово в файле, вы можете использовать параметр -c grep, например,

 grep -c shell test.txt 

Ни один из них фактически не считает слова , но может соответствовать другим вещам, которые включают эту строку . Большинство реализаций grep (GNU grep, современных BSD, а также AIX, HPUX, Solaris) предоставляют опцию -w для слов, однако это не относится к POSIX. Они также признают регулярное выражение, например,

 grep -e '\<shell\>' test.txt 

который соответствует опции -w . Опять же, это не в POSIX. Solaris документирует это, в то время как AIX и HPUX описывают -w без упоминания регулярного выражения. Все они кажутся последовательными, рассматривая слово «слово» как последовательность буквенно-цифровых символов плюс подчеркивание.

Вы можете использовать регулярное выражение POSIX с grep для соответствия словам (разделенные пробелами и т. Д.), Но в вашем примере нет ни одного, который является только «оболочкой»: у всех их есть другой персонаж, касающийся матчей. В качестве альтернативы, если вы заботитесь только о буквенных цифрах (и не подчеркивайте) и не возражаете против подстроки, вы можете сделать

 tr -c '[[:alnum:]]' '\n' test.txt |grep -c shell 

Опция -o предлагается не POSIX, и поскольку OP не ограничивает вопрос Linux или BSD, это не то, что я бы рекомендовал. В любом случае это не соответствует словам , а строкам (что было ожиданием OP).

Для справки:

  • Grep
  • Туалет

Команда grep выводит все строки, на которых отображается «shell». Не только слово «оболочка». Как видно ниже:

 grep shell test.txt for shell_A shell_B shell_C 

Я бы рекомендовал использовать вариант

-o, – только совпадение

Так:

 grep -o "shell" test.txt | wc -w 

так как вы можете иметь слово «оболочка» несколько раз в строке, я бы начал с разбивки текста на отдельные слова на строку, а затем сделать grep

 < test.txt tr -s "[[:blank:]]" "\n" | grep "shell" | wc -w 

вы также можете использовать wc -l или покончить с wc и использовать grep -c "shell"

И вы даже можете удалить необходимость tr в файле, который у вас есть, и использовать:

grep -c "shell" test.txt

Вы должны использовать wc -l для этого, то есть grep shell test.txt | wc -l grep shell test.txt | wc -l . Это возвращает 3.

  • Почему wc -l говорит мне, что этот непустой файл имеет 0 строк?
  • Как отобразить количество строк, слов и символов в отдельных строках?
  • Как найти строку с наименьшими символами
  • команда, как wc, но с тиковым поведением
  • Подсчет количества строк в файле независимо от символа окончания строки
  • Подсчитывать строки без прерывания ввода
  • Возвращает количество совпадений с помощью find / replace с помощью sed
  • Рекурсивно подсчитывать количество слов в одинаково именованных файлах в разных каталогах
  • unix: получить символы от 10 до 80 в файле
  • Количество вкладок в строке в текстовом файле с utils
  • Результат «ls | wc -l "не соответствует реальному количеству файлов
  • Linux и Unix - лучшая ОС в мире.