Piping в grep используя cat возвращает ошибку: такого файла или каталога нет - PullRequest
0 голосов
/ 17 февраля 2020

Я практикуюсь на bash. Когда я пытаюсь выполнить эту команду, я получаю сообщение об ошибке: «grep: where: Нет такого файла или каталога».

cat file2.txt | tr " " "\n" | grep –i where | wc -l
Content of file2.txt = 1 2 3 4 where 5 where 7 where

Ответы [ 3 ]

6 голосов
/ 17 февраля 2020

Почему появляется сообщение об ошибке

Если вы скопируете команду из вопроса и проанализируете ее с помощью UTF-8 в интерпретатор Unicode, то перед i будет en da sh U + 2013, а не дефис-минус - (U + 002D). Это означает, что grep обрабатывает –i как шаблон, который нужно искать, и where как файл, который нужно искать, который не существует - как говорится в сообщении об ошибке.

$ echo "grep –i where | wc -l" | utf8-unicode -w 3
0x67           = U+0067
0x72           = U+0072
0x65           = U+0065
0x70           = U+0070
0x20           = U+0020
0xE2 0x80 0x93 = U+2013
0x69           = U+0069
0x20           = U+0020
0x77           = U+0077
0x68           = U+0068
0x65           = U+0065
0x72           = U+0072
0x65           = U+0065
0x20           = U+0020
0x7C           = U+007C
0x20           = U+0020
0x77           = U+0077
0x63           = U+0063
0x20           = U+0020
0x2D           = U+002D
0x6C           = U+006C
$

код для utf8-unicode теперь доступен в моем репозитории SOQ (вопросы о переполнении стека) на GitHub в виде файла utf8-unicode-1.11.tgz в подкаталоге packages . Это текущая версия - utf8-unicode -V сообщает utf8-unicode: UTF8-UNICODE Version 1.11 (2017-06-12 06:22:15) и utf8-unicode -h помогает. Использование -w 3 означает, что он оставляет достаточно места для каждой кодовой точки шириной 3 байта, что приводит к большему столбцовому выводу (по умолчанию -w 1).

Другие улучшения

В Анализ выше, я не рассматривал, как улучшить сценарий в целом. Если у вас достаточно современный GNU grep, вы можете использовать только две команды:

$ grep -iow where file2.txt | wc -l

Вы не можете уменьшить его до одной команды; использование grep -ciow where file2.txt дает 1, а не 3 (поскольку совпадает только одна строка ввода).

С не-GNU grep вам может понадобиться:

$ tr ' ' '\n' < file2.txt | grep -ic where

Остерегайтесь UUo C - Бесполезное использование cat.

3 голосов
/ 17 февраля 2020

В вашей команде нет ничего плохого. И это должно работать как есть. Может быть, вы скопировали и вставили некоторые невидимые символы, которые испортили его. Скопируйте и вставьте приведенную ниже команду и попробуйте снова, изменив свои реальные значения.

cat script.sh | tr ' ' '\n' | grep -i echo | wc -l

Дайте мне знать, если это работает.

1 голос
/ 17 февраля 2020

Несколько способов:

С GNU grep:

grep -oiw echo script.sh | wc -l
  • -o: только выходные данные соответствуют.
  • -i: Case- нечувствительные совпадения.
  • -w: совпадения всего слова.
  • wc -l: подсчет совпадений.

С помощью sed для разделения команд по одной в строке :

sed 's/[[:space:][:punct:]]\+/\n/g' script.sh | grep -ciF echo
  • sed 's/[[:space:][:punct:]]\+/\n/g': заменить все пробелы, возврат каретки, табуляции, пунктуацию на новую строку.
  • grep -ciF echo: подсчитать строки с учетом регистра без учета регистра текст echo (без RegEx).
...