Код для данного вопроса в сценарии оболочки - PullRequest
0 голосов
/ 11 февраля 2020

Напишите программу сценария оболочки для поиска ключевого слова во всех файлах в текущей папке и отображения количества вхождений в каждом файле.

1 Ответ

0 голосов
/ 11 февраля 2020

В зависимости от ожидаемого выхода вам может потребоваться поиграть с grep параметрами

Вот возможное решение:

grep -o pattern * | awk -F: '{a[$1]++;}END{for (i in a)print i, a[i];}'

Объяснение:

Рассмотрим шаблон поиска как строку abc

Я сделал следующие предположения , поскольку они прямо не указаны в вашем вопросе:

  • Подсчет множественных вхождений шаблона для каждой строки в каждом файле
  • Подсчет вхождений шаблона, которые могут произойти в слове и / или окружен другими символами
  • Распечатать имя файла и считать в выводе

Я создал следующие тестовые файлы в том же каталоге что вы намереваетесь выполнить поиск:

  1. file1 с одним вхождением шаблона abc: ожидаемое число = 1

    cat > file1
    abc
    xyz
    
  2. file2 с несколькими вхождениями шаблона abc в одной строке: ожидаемое количество = 2

    * 1 050 *
  3. file3 с шаблоном, встроенным в слово / окруженным другими символами: ожидаемое число = 5

    cat > file3
    xabcyz
    xabcyabc
    123abc
    abc_
    


Шаг 1 :

Используйте grep -o abc * для генерации следующего вывода:

    file1:abc
    file2:abc
    file2:abc
    file3:abc
    file3:abc
    file3:abc
    file3:abc
    file3:abc

Что делает опция -o?

    -o, --only-matching
    Print only the matched (non-empty) parts of a matching line, 
    with each such part on a separate output line.

man grep, чтобы узнать больше grep вариантов ..


Шаг 2 :

(Примечание : Хотя это не имеет непосредственного отношения к вашему вопросу, я включаю объяснение того, как вышеупомянутые выходные данные агрегируются для подсчета возвращаемых значений)

Рассматривать выходные данные шага 1 как ассоциативный массив a с индекс: file1, file2 и т. д.

Передать вывод с помощью awk -F: '{a[$1]++;}END{for (i in a)print i, a[i];}'

В команде awk:

  • Указать разделитель полей F как :, поскольку нас интересует только первый столбец (т. Е. Индекс массива)
  • a[$1]++ увеличивает счетчик индекса при перемещении по массиву
  • END{actions} выполняет то, что вы указали в actions перед выходом
  • for (i in a)print i, a[i]; - это значение для l oop, которое печатает каждый индекс i из массива a с соответствующим количество a[i]


Окончательный результат:

    $ grep -o abc *  | awk -F: '{a[$1]++;}END{for (i in a)print i, a[i];}'
    file1 1
    file2 2
    file3 5

Надеюсь, это поможет.

...