Разработка утилит Bash по работе с текстом: cat, grep.
Данный проект был выполнен для ознакомления с базовыми утилитами Bash по работе с текстом на языке программирования С. В качестве утилит были выбраны cat и grep, которые достаточно часто используются при работе в терминале Linux. В рамках данного проекта был получен опыт организации утилит Bash, и применения структурного подхода при разработке.
cat был частью ранних версий Unix, например, Версии 1, и заменил pr, утилиту PDP-7 и Multics для копирования одного файла на экран.
cat — одна из наиболее часто используемых команд в Unix-подобных операционных системах. Команда имеет три взаимосвязанные функции в отношении текстовых файлов: отображение, объединение их копий и создание новых.
./my_cat [OPTION] [FILE]...
| № | Опция | Описание |
|---|---|---|
| 1 | -b, --number-nonblank | Нумерует только непустые строки |
| 2 | -e | Эквивалентно -vE |
| 3 | -E, --show-ends | Отображает символы конца строки как $ |
| 4 | -n, --number | Нумерует все выходные строки |
| 5 | -s, --squeeze-blank | Сжимает несколько смежных пустых строк |
| 6 | -t | Эквивалентно -vT |
| 7 | -T, --show-tabs | Отображает табуляцию как ^I |
| 8 | -v, --show-nonprinting | Использует обозначения ^ и M-, за исключением LFD и TAB |
| 9 | -V, --version | Выводит информацию о версии и выходит |
| 10 | --help | Выводит данное описание и выходит |
Томпсон написал первую версию на PDP-11 языке ассемблера, чтобы помочь Ли Э. МакМахону проанализировать текст «Записок Федералиста» и определить авторство отдельных статей. Текстовый редактор ed (также созданный Томпсоном) имел поддержку регулярных выражений, но его нельзя было использовать для такого большого объема текста, поэтому Томпсон извлек этот код в отдельный инструмент. Он выбрал это название, потому что в ed команда g / re / p печатала все строки, соответствующие заданному шаблону. grep впервые был включен в Версию 4 Unix. Заявив, что он «обычно упоминается как прототип программного средства», Макилрой приписал grep «безвозвратное внедрение» философии инструментов Томпсона в Unix.
./my_grep [OPTION]... PATTERNS [FILE]...
| № | Опция | Описание |
|---|---|---|
| 1 | -e, --regexp=PATTERNS | Использует PATTERNS в качестве шаблона |
| 2 | -f, --file=FILE | Берет PATTERNS из FILE |
| 3 | -i, --ignore-case | Игнорирует различия регистра в шаблонах и данных |
| № | Опция | Описание |
|---|---|---|
| 4 | -v, --invert-match | Инвертирует смысл поиска соответствий |
| 5 | -V, --version | Выводит информацию о версии и выходит |
| 6 | --help | Выводит данное описание и выходит |
| № | Опция | Описание |
|---|---|---|
| 7 | -s, --no-messages | Подавляет сообщения об ошибках о несуществующих или нечитаемых файлах |
| 8 | -n, --line-number | Предваряет каждую строку вывода номером строки из файла ввода |
| 9 | -h, --no-filename | Выводит совпадающие строки, не предваряя их именами файлов |
| 10 | -o, --only-matching | Печатает только совпадающие (непустые) части совпавшей строки |
| 11 | -l, --files-with-matches | Выводит только совпадающие файлы |
| 12 | -c, --count | Выводит только количество совпадающих строк |
Проект имеет модульную структуру для лучшей организации кода.
└── SimpleBashUtils/ # Репозиторий с исходным кодом и ресурсами
├── cat/ # Модуль, реализующий утилиту cat
│ ├── test/ # Директория с текстовыми файлами для тестов
│ ├── cat_utils.c # Модуль, реализующий парсинг и обработку опций
│ ├── cat_utils.h # Заголовочный файл
│ ├── cat.c # Основной модуль с функцией main
│ ├── Makefile # Управление сборкой cat
│ └── run_test.sh # Скрипт, реализующий тестирование cat
├── grep/ # Модуль, реализующий утилиту grep
│ ├── test/ # Директория с текстовыми файлами для тестов
│ ├── grep_utils.c # Модуль, реализующий парсинг и обработку опций
│ ├── grep_utils.h # Заголовочный файл
│ ├── pattern_utils.c # Модуль для хранения и извлечения переданных шаблонов
│ ├── pattern_utils.h # Заголовочный файл
│ ├── grep.c # Основной модуль с функцией main
│ ├── Makefile # Управление сборкой grep
│ └── run_test.sh # Скрипт, реализующий тестирование grep
├── resources/ # Каталог с ресурсами
└── README.md # Документация на русскомДля сборки проекта требуется make и компилятор gcc.
-
Клонируйте репозиторий:
git clone [ссылка на РЕПОЗИТОРИЙ]
-
Перейдите в каталог с интересующей вас утилитой
cd cat/ # утилита cat # или cd grep/ # утилита grep
-
Соберите проект с помощью Makefile:
make all
Исполняемый файл выбранной утилиты (my_cat или my_grep) будет создан в соответсвующей директории.
Цели Makefile имеют одинаковые названия для обеих утилит.
| Команда | Описание |
|---|---|
make all |
Сборка проекта |
make clean |
Удаление собранных файлов |
make rebuild |
Полная пересборка (clean + build) |
Для форматировния кода потребуется clang-format, исходные настройки стиля (.clang-format) прилагаются к проекту. Для статического анализа кода потребуется cppcheck (2.7).
| Команда | Описание |
|---|---|
make format |
Форматирование кода clang-format |
make check-format |
Проверка стиля кода |
make cppcheck |
Статический анализатор кода |
Для проверки утечек памяти потребуется valgrind (3.18.1).
| Команда | Описание |
|---|---|
make valgrind |
Анализ программы на наличие утечек памяти |
make test |
Запуск тестирования утилиты на базе сравнения с поведением реальной утилит Bash |
