Skip to content

Latest commit

 

History

History
152 lines (110 loc) · 13.7 KB

README_RUS.md

File metadata and controls

152 lines (110 loc) · 13.7 KB

Simple Bash Utils

Разработка утилит Bash по работе с текстом: cat, grep.

Contents

  1. Preamble
  2. Chapter I
    1.1. Introduction
  3. Chapter II
    2.1. Information
  4. Chapter III
    3.1. Part 1
    3.2. Part 2
    3.3. Part 3
    3.4. Part 4

Preamble

simple_bash_utils

То был обычный серый осенний день 1993 года. Вы пришли домой со своей работы в Hewlett-Packard, немного уставший. У вас была небольшая двухкомнатная квартира на окраинах города N, а в холодильнике был слабоалкогольный напиток под названием pivo. Вы взяли этот напиток, пачку крекеров и пошли в свое укромное местечко, где стоял компьютер производства Dell.

*Щелчок* - нажата кнопка включения. Пару минут загрузки и..да, это приятное чувство. Вы всегда испытываете его при включении компьютера. Пару секунд недвижимого наслаждения и вот вы уже открываете браузер Mosaic, заходите на свой любимый форум..листаете треды, попивая pivo. И вдруг натыкаетесь на очень интересное обсуждение, которое началось следующим сообщением:

Hello everybody out there using minix -

I'm doing a (free) operating system (just a hobby, won't be big and professional like gnu) for 386(486) AT clones. This has been brewing since april, and is starting to get ready. I'd like any feedback on things people like/dislike in minix, as my OS resembles it somewhat (same physical layout of the file-system (due to practical reasons) among other things).

I've currently ported bash(1.08) and gcc(1.40), and things seem to work. This implies that I'll get something practical within a few months, and I'd like to know what features most people would want. Any suggestions are welcome, but I won't promise I'll implement them :-)

Linus (torvalds@kruuna.helsinki.fi)

PS. Yes - it's free of any minix code, and it has a multi-threaded fs. It is NOT portable (uses 386 task switching etc), and it probably never will support anything other than AT-harddisks, as that's all I have :-(.

— Linus Torvalds

"Очень любопытно", - подумали вы про себя. Пролистав тред ниже вы заметили, что bash не так уж хорошо портирован, и некоторые функции не работают. В частности возникли проблемы с утилитами по работе с текстом: cat и grep. "Интересная задачка, заодно будет здорово помочь этому Линусу Торвальдсу", - сказали вы вслух и сразу же написали в тред сообщение о том, что уже начинаете этим заниматься. Что ж, начинайте!

Chapter I

Introduction

В этом проекте Вам предстоит познакомиться ближе и разработать базовые утилиты Bash по работе с текстами на языке программирования Си. Эти утилиты (cat и grep) достаточно часто используются при работе в терминале Linux. В рамках этого проекта предполагается знакомство с организацией утилит Bash и закрепление структурного подхода.

Chapter II

Information

cat История

cat был частью ранних версий Unix, например, Версии 1, и заменил pr, утилиту PDP-7 и Multics для копирования одного файла на экран.

cat Использование

Cat - одна из наиболее часто используемых команд в Unix-подобных операционных системах. Команда имеет три взаимосвязанные функции в отношении текстовых файлов: отображение, объединение их копий и создание новых.

cat [OPTION] [FILE]...

cat Опции

Опции Описание
1 -b (GNU: --number-nonblank) нумерует только непустые строки
2 -e предполагает и -v (GNU only: -E то же самое, но без применения -v) также отображает символы конца строки как $
3 -n (GNU: --number) нумерует все выходные строки
4 -s (GNU: --squeeze-blank) сжимает несколько смежных пустых строк
5 -t предполагает и -v (GNU: -T то же самое, но без применения -v) также отображает табы как ^I

grep История

Томпсон написал первую версию на PDP-11 языке ассемблера, чтобы помочь Ли Э. МакМахону. проанализировать текст Записок Федералиста для того, чтобы определить авторство отдельных статей. Текстовый редактор ed (также созданный Томпсоном) имел поддержку регулярных выражений, но не мог использоваться для такого большого объема текста, поэтому Томпсон извлек этот код в отдельный инструмент. Он выбрал это название, потому что в ed команда g / re / p печатала все строки, соответствующие заданному шаблону. grep впервые был включен в Версию 4 Unix. Заявив, что он «обычно упоминается как прототип программного средства», Макилрой приписал grep «безвозвратное внедрение» философии инструментов Томпсона в Unix.

grep Использование

grep [options] template [file_name]

grep Опции

Опции Описание
1 -e Шаблон
2 -i Игнорирует различия регистра.
3 -v Инвертирует смысл поиска соответствий.
4 -c Выводит только количество совпадающих строк.
5 -l Выводит только совпадающие файлы.
6 -n Предваряет каждую строку вывода номером строки из файла ввода.
7 -h Выводит совпадающие строки, не предваряя их именами файлов.
8 -s Подавляет сообщения об ошибках о несуществующих или нечитаемых файлах.
9 -f file Получает регулярные выражения из файла.
10 -o Печатает только совпадающие (непустые) части совпавшей строки.

Chapter III

  • Программы должны быть разработаны на языке Си стандарта C11 с использованием компилятора gcc
  • Код программ cat и grep должен находиться в ветке develop в папках src/cat/ и src/grep/ соответственно
  • Не использовать устаревшие и выведенные из употребления конструкции языка и библиотечные функции. Обращать внимания на пометки legacy и obsolete в официальной документации по языку и используемым библиотекам. Ориентироваться на стандарт POSIX.1-2017
  • При написании кода необходимо придерживаться Google Style
  • Программы должны представлять собой исполняемый файл с аргументами командной строки
  • Сборка программ должна быть настроена с помощью Makefile с соответствующими целями: s21_cat, s21_grep
  • Если используются сторонние библиотеки, в Makefile должны быть заложены сценарии сборки, предусматривающие их подключение/загрузку
  • Необходимо покрытие интеграционными тестами для всех вариантов флагов и входных значений, на базе сравнения с поведением реальных утилит Bash
  • Программа должна быть разработана в соответствии с принципами структурного программирования
  • Необходимо исключить дублирование кода, переиспользовать общие модули между утилитами. Общие модули можно вынести в отдельную папку src/common
  • Можно использовать стандартные и нестандартные библиотеки языка Си, можно использовать собственноручно разработанные библиотеки из других проектов
  • Формулировка сообщения при возникновении ошибочной ситуации не имеет значения
  • Ввод через stdin обрабатывать не обязательно

Part 1. Работа с утилитой cat

Необходимо разработать утилиту cat:

  • Поддержка всех флагов (включая GNU версии), указанных выше
  • Исходные, заголовочные и сборочный файлы должны располагаться в директории src/cat/
  • Итоговый исполняемый файл должен располагаться в директории src/cat/ и называться s21_cat

Part 2. Работа с утилитой grep

Необходимо разработать утилиту grep:

  • Поддержка следующих флагов: -e, -i, -v, -c, -l, -n
  • Для регулярных выражений можно использовать только библиотеки pcre или regex
  • Исходные, заголовочные и make файлы должны располагаться в директории src/grep/
  • Итоговый исполняемый файл должен располагаться в директории src/grep/ и называться s21_grep

Part 3. Дополнительно. Реализация некоторых флагов утилиты grep

Необязательное задание на дополнительные баллы. Необходимо разработать утилиту grep:

  • Поддержка всех флагов, включая: -h, -s, -f, -o
  • Для регулярных выражений можно использовать только библиотеки pcre или regex
  • Исходные, заголовочные и make файлы должны располагаться в директории src/grep/
  • Итоговый исполняемый файл должен располагаться в директории src/grep/ и называться s21_grep

Part 4. Дополнительно. Реализация комбинаций флагов утилиты grep

Необязательное задание на дополнительные баллы. Необходимо разработать утилиту grep:

  • Поддержка всех флагов, включая их парные комбинации (например, -iv, -in)
  • Для регулярных выражений можно использовать только библиотеки pcre или regex
  • Исходные, заголовочные и make файлы должны располагаться в директории src/grep/
  • Итоговый исполняемый файл должен располагаться в директории src/grep/ и называться s21_grep

💡 Нажми тут, чтобы поделиться с нами обратной связью на этот проект. Это анонимно и поможет команде Педаго сделать твоё обучение лучше.