Лабораторная работа №2. Тема: "Работа с текстовой информацией в ОС Astra Linux".
<---- Обратите внимание на консольный сервер в левой части экрана, вам следует использовать этот сервер для выполнения лабораторной работы
Цель работы
- познакомиться с функционалом регулярных выражений в утилите grep;
- познакомиться с редактированием текстовых потоков с помощью sed;
- познакомиться с инструментом awk для составления командных строк.
Оборудование, ПО:
Виртуальная машина или компьютер под управлением ОС AstraLinux 1.7 в режиме защищенности "Воронеж" или выше.
Ход работы
Умение пользоваться инструментами фильтрации и поиска текста в Linux - крайне полезный и нужный навык для инженера, который работает с данной ОС. Не стоит полагать, что этот навык нужен только для специалистов, которые много работают с документами. Поиск логов, создание скриптов для автоматизации, быстрые административные задачи по смене ярлыков, поиск зависшего процесса и многое другое возможно с применением этих инструментов!
Введем новый термин - Регулярные выражения
Это нужно знать!
Регулярные выражения - это шаблон, который соответствует сразу нескольким наборам строк. Шаблон состоит из операторов, используя символы и метасимволы (о метасимволах поговорим подробнее позднее).
Начнем с первого инструмента работы с текстом - утилита Grep
grep - утилита командной строки, которая находит строку из файлов
Формат работы с grep следующий:
grep [ПАРАМЕТР] искомая строка [ФАЙЛ]
Начнем с простого:
$ grep processor /proc/cpuinfo
В ответ, вам вернётся номера процессоров (каждого ядра отдельно). Например:
processor : 0
processor : 1
По умолчанию, grep регистрозависимый, если запрос сформирован с прописных букв, то записи со строчными буквами отображены не будут.
Проверим, что будет если мы введем не полностью слово "processor", а например лишь его часть - слово "proc":
$ grep proc /proc/cpuinfo
Результат тот же, значит делаем вывод - grep, при стандартном использовании без ключей, ищет строку в составе текста и слова.
А что, если нам нужно найти именно слово "proc"? Как избежать "однокоренные" значения? Воспользуемся параметром "-w":
$ grep -w "proc" /proc/cpuinfo
Как можно заметить, ответа не поступило! В файле /proc/cpuinfo нет строк "proc".
Давайте проверим на другом примере, выполним 'grep' на /proc/cpuinfo. Поищем слово "cpu":
$ grep cpu /proc/cpuinfo
Как можно заметить, в этом случае, мы получили много строк, где слово "cpu" встречается отдельно, а также в составе других слов.

Проверим с ключом -w:

Теперь, множество строк пропали, указав вам только значения конкретных слов "cpu".
А что, например, если нам нужно найти строку, которая начинается на шаблонное слово, но продолжается и оканчивается на различные символы? Попробуем найти все строчки, которые начинаются на слово "cpu". Обратите внимание, мы применили метасимволы. К ним относятся: ".", "\", "$", "*", "[", "]", "^", "&".
$ grep 'cpu\>' /proc/cpuinfo

А теперь, все строчки которые оканчиваются на слово "cpu":
$ grep "<cpu " /proc/cpuinfo

А если нужное нам слово располагается в начале или конце строки? Попробуем прописать:
$ grep '^cpu' /proc/cpuinfo
В ответ получим строки, которые начинаются на "cpu":

Проверим теперь другую конструкцию:
$ grep 'cpu$' /proc/cpuinfo
В нашем примере файла строк, которые заканчивались на слово "cpu" - нет. Попробуем сформировать другой запрос:
$ grep 'yes$' /proc/cpuinfo

Теперь получилось, в ответе команды получили только строки, где в конце есть слово "yes".
А если, например, задача увидеть строки рядом с искомой? Для этого нам потребуется ключ -C. Данным ключом задается количество строк, которые нужно напечатать. Обратите внимание, что будут показаны строки, расположенные ниже искомого значения.
Например, найдем строку расположенную ниже слова "processor":
$ grep -C 1 processor /proc/cpuinfo

Для удобства "grep" разделил найденные значения пробелом, чтобы было удобнее читать результат.
Попробуем задать значение строк побольше:
$ grep -C 4 processor /proc/cpuinfo

Стоит дополнить, что в некоторых дистрибутивах вместо ключа -C используют -A (after, после). Результат работы команды:
$ grep -C 4 processor /proc/cpuinfo
и
$ grep -A 4 processor /proc/cpuinfo
Одинаковый.
Конечно, с помощью ключа -B (before, до) можно вывести строки выше искомого значения:
$ grep -B 4 processor /proc/cpuinfo

Будьте внимательны - в нашем примере, строка processor = 0 является первой записью в файле /proc/cpuinfo. А значит "before" ничего не покажет.
Перейдем к серьезным регулярным выражениям.
Сделаем текстовый файл со следующим содержимым:
client 10.10.10.1
server 192.168.1.1
computer 127.78.245.1
router 88.11.22.33
router2 99.22.33.44
linux1 111.111.22.33
linux2 173.65.234.1
linux3 243.1.1.1
linux4 109.105.110.115
Первым делом, сделаем выборку по слову linux, при условии что после искомого слова есть значения от 1 до 3:
$ grep "linux[1-3]" test.txt

А если наоборот, исключая эти записи:
$ grep "linux[^1-3]" test.txt

Для понимания, определим какие метасимволы мы использовали в вышеуказанных примерах. Метасимволы "[]" позволяют определить подмножество символов, которые необходимо распознавать при выполнении операции поиска или подстановки. Запись группы символов, заключенных в квадратные скобки, означает: "любой одиночный символ из указанных". Метасимвол ^ (отрицание). Позволяет выполнять инверсию запроса, который вы сформировали.
Давайте дополним наш текст дополнительными строчками:
client 10.10.10.1
server 192.168.1.1
computer 127.78.245.1
router 88.11.22.33
router2 99.22.33.44
linux1 111.111.22.33
linux2 173.65.234.1
linux3 243.1.1.1
linux4 109.105.110.115
New Word
Another Word
Privet
И выполним выборку только строк с IP-адресами. Для этого воспользуемся метасимволами в сочетании с опцией -E. Данная опция отвечает за поддержку расширенного регулярного выражения:
$ grep -E '\b[0-9]{1,3}(\.[0-9]{1,3}){3}\b' test.txt

Мы получили результат выборки строк, в которых у нас есть IP-адрес из 4 цифр разделенных точками (октетами). Прочие строчки, которые не имеют чисел в строке или состоят не из 4-ых значений.
Теперь, поговорим о метасимволах, которые мы применили в данном запросе. Метасимвол \b указывает на границы искомой строки, считайте, это как способ обособления. Метасимволы "[]" позволяют определить подмножество символов, которые необходимо распознавать при выполнении операции поиска или подстановки. Запись группы символов, заключенных в квадратные скобки, означает: "любой одиночный символ из указанных". Например, если "[0123456789]", это будет означать: "любая цифра". Можно записать и короче: "[0-9]". Метасимвол {} позволяет определить подмножество символов, расположенных в произвольном порядке. Понять как он работает можно на простом примере:
$ touch test{1,2,3,4}
В ответ получим:

При этом, если мы выполним аналогичную команду, но например с метасимволом []:
$ touch test[1-4]

Как видим, в этом случае [] не отрабатывает. Применяемые далее () выполняют группировку элементов, для поиска всех совпадений по группе. Например, можно применить так:
$ grep rosatom.(lab | net | ru | com)
В таком случае найдено будет любое совпадение, совпадающее по запросу. Дальнейшая конструкция позволит выполнить выбору 4 раза, для того чтобы сформировать поиск именно по 4-ых значной строке, разделенная точкой:
\.[0-9]{1,3}){3}
\. - указывает на общий разделитель. [0-9]{1,3} - уже знакомая нам конструкция, указывает что число состоит из 3 символов. {3} - повторяет запрос 4 раза. Потому что нумерация идет с нуля. \b - закрывает запрос. Таким хитрым образом, получаем выборку по IP-адресам из файла.
Следующая конструкция выполняет ту же самую процедуру, но пишется сложнее, так как не применяется такое большое множество метасимволов. В этом примере мы явно видим разделение значений через \., а также описание искомых параметров:
$ grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" test.txt

А что, если есть задача вывести только адреса? Без слов рядом. На помощь приходит ключ -o (от англ. only-matching) в этом случае, выборка будет произведена по строгому соответствию шаблону:
$ grep -oE "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" test.txt

Давайте попробуем отредактировать наш test.txt, закомментируем несколько параметров:
client 10.10.10.1
server 192.168.1.1
computer 127.78.245.1
router 88.11.22.33
router2 99.22.33.44
linux1 111.111.22.33
linux2 173.65.234.1
#linux3 243.1.1.1
#linux4 109.105.110.115
Напомним, что в Linux символ # - является комментарием, операционная система, скрипты и различные программы игнорируют строки, которые начинаются на #. Это позволяет непосредственно в коде программы оставлять заметки или подсказки для пользователя.
$ grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" test.txt
Как мы видим, при вводе уже знакомой нам команды по выборке IP-адреса из текста. Она показывает нам строки, которые имеют символ #. Предположим, что нам, как администраторам совершенно неинтересно посмотреть закомментированные (считайте неактивные) параметры. С помощью ключа -v у команды grep можно установить инверсию запроса, то есть показать, наоборот, не подходящие строки под запрос. А с помощью символа | (читается как - вертикальная черта, или на профессиональном жаргоне - "пайп" от англ. pipe ) Команда выглядит вот так:
$ grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" test.txt | grep -v '#'

Наблюдаем результат, все строки, которые не имеют комментариев исключены из выдачи. Это крайне удобная функция, например, если нужно вывести все измененные значения в конфигурационном файле. Помните, /etc/ssh/sshd_config - основной конфигурационный файл сервера SSH на вашем компьютере. Данный файл определяет настройки для подключения внешних клиентов. В этом файле, все закомментированные строки являются значениями по умолчанию, а значит что при их изменении символ комментария '#' нужно удалять. Команда выглядит так:
$ cat /etc/ssh/sshd_config | grep -v '#'

Попробуйте данный же файл посмотреть без grep:
$ cat /etc/ssh/sshd_config
Очевидно, что для быстрого просмотра намного удобнее анализировать файл без - '#'.
Перед тем, как перейти к теме работы с sed (потоковый текстовый редактор) стоит обратиться к тому, что так часто откладывали по ходу данной лабораторной работы. Нам пора познакомиться с метасимволами.
Метасимвол . (точка)
Применение достаточно широкое, например: При конструкции: "символ" "." "символ" означает, что между двумя искомыми символами может быть какой-то регулярный элемент. Для эксперимента создадим файл test1.txt со следующим наполнением:
rea
r+a
r0a
rXa
reea
rosa
reka
А затем, попробуем ввести команду:
$ grep r.a test1.txt
Наблюдаем следующий вывод:
rea
r+a
r0a
rXa
Как можно заметить, мы получили все строки, где есть слова начинающиеся на "r" и заканчивавшиеся на "a". Попробуем поставить два символа точки, ведь у нас есть строки, которые состоят из 4-ых букв:
$ grep r..a test1.txt
Наблюдаем следующий вывод:
reea
rosa
reka
А что будет если написать только первый символ и точку? Например так:
$ grep r. test1.txt
В ответ получим все строчки из файла, ведь все слова начинаются на букву "r". Дополним файл еще строками:
rosenergoatom
TestWord
Linux
Повторим команду:
$ grep r. test1.txt
В итоге, получаем все слова которые не только начинаются на букву "r", но и содержат данную букву в своей конструкции:
rea
r+a
r0a
rXa
reea
rosa
reka
rosenergoatom
TestWord
Слово Linux в выводе команды отсутствует, так как не содержит букву "r". Обратите внимание, что grep в стандартном режиме работы регистрозависимый.
Метасимвол \ (обратная дробная черта)
Обратная дробная черта (или обратный слэш) отменяет специальное значение, которое может иметь следующий за ней символ, в частности, "\." означает действительно точку, а не специсимвол - "любой символ". Свойства обратной черты мы уже наблюдали в этой команде:
$ grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" test.txt | grep -v '#'
Метасимвол $ (знак доллара)
В зависимости от того, как используется знак денежной единицы ('$'), он может обозначать конец файла или конец строки. Когда указывается диапазон (от строки 1 до строки '$'), речь идет о конце файла. Для утилиты Grep данный символ неактуальный, в отличии, например от sed. Создадим файл example.txt со следующим содержимым, к тому же проверим как работает sed с русским языком:
Это текст
Это новая строка в тестовом файле
Это третья строка в тестовом файле
Это четвертая строка в текстовом файле
Это пятая строка в текстовом файле
А затем выполним команду:
$ sed '2,$s/тестовом/текстовом' example.txt
Без применения ключа '-i' изменения в файл не будут внесены, а результат корректировки файла будет выведен в консоль.

Разберемся подробнее в том, что сейчас произошло. Конструкция:
$ sed '2,$s/тестовом/текстовом' example.txt
Означает, что начиная со 2 строки и до конца файла $ выполняем замену (буква s сокращение от switch или substitute, то есть сменить или заменить) слово "тестовом" на "текстовом". Проверьте, изменилось ли содержимое вашего файла с применением ключа -i.
Метасимвол ^ (возврат каретки)
На самом деле, символ "возврат каретки" напрямую относится к историческому прошлому пишущих машинок. Он использовался после ввода строки и заставлял узел, держащий бумагу (каретку), вернуться вправо, так что машинка была готова печатать дальше на левой стороне бумаги. В современных компьютерных системах метасимвол "^" указывает начало строки. Например, давайте в начало нашей строки вставим пробел:
$ sed 's/^/ /' example.txt

В примере выше указано несколько пробелов, для наглядности.
Метасимвол * (звездочка)
В утилитах sed или grep данный метасимвол используется редко. Но, например, пользоваться конструкцией копирования всех файлов по имени *.txt из директории:
$ cp *.txt /opt
Или удаление всех файлов, например, с именем *.txt:
$ rm *.txt
Метасимволы [] (квадратные скобки)
В ходе выполнения данной работы, мы уже обращались к данному метасимволу. Напомним, что он позволяет определить подмножество символов. Как целостный массив данных.
Метасимвол & (амперсанд)
Символ &, если мы говорим про утилиты grep, sed, awk, выполняет сокращение видимого текста. Предположим, имеется строка:
В ЭТО ВРЕМЯ
и требуется преобразовать ее в строку:
В ЭТО ВРЕМЯ СУТОК
конечно, для этого можно воспользоваться командой:
s/ВРЕМЯ/ВРЕМЯ СУТОК/
однако требование повторно указывать слово "ВРЕМЯ" кажется неразумным. Для того, чтобы избежать этого повторения, используется символ "&". В правой части команды подстановки амперсенд означает "найденный текст", так что можно ввести команду:
s/ВРЕМЯ/& СУТОК/
Конечно, в данном примере экономия будет незначительной, однако если количество символов велико, экономится много вводимых символов. Снижается также вероятность совершения ошибки при вводе заменяющего текста. Например, для того, чтобы заключить в скобки строку, независимо от ее длины, можно использовать команду:
s/.*/(&)/
Амперсенд может встречаться в правой части команды несколько раз. Команда:
s/ВРЕМЯ/& СУТОК И & ГОДА/
построит строку:
ВРЕМЯ СУТОК И ВРЕМЯ ГОДА
а команда:
s/В ЭТО ВРЕМЯ/&? &!!!/
преобразует исходную строку в:
В ЭТО ВРЕМЯ?
В ЭТО ВРЕМЯ!!!
Перейдем к практике, приведем файл example.txt к следующему формату:
ВРЕМЯ
А затем протестируем указанные выше примеры:
$ sed 's/ВРЕМЯ/& СУТОК' example.txt

Стоит уточнить, что в Bash в терминале Linux - & используется для составления больших взаимосвязанных команд, например:
$ mkdir ./privet && touch ./privet/hello
В этом случае команда последовательно создаст директорию, а затем файл внутри неё. Но! Если первая команда отработает с ошибкой, то вся строка будет отменена. Удачно должны завершиться все последовательные команды.
Что такое SED? Знакомимся подробнее.
SED – это потоковый редактор текста (от англ. stream editor), c помощью которого можно выполнять с файлами множество операций вроде поиска и замены, вставки или удаления. При этом чаще всего он используется именно для поиска и замены. Перейдем сразу к примерам. Подготовим файл example1.txt со следующим наполнением:
Кошка - друг человека. Кошка с давних времен помогала людям в хозяйстве. Кошка была источником вдохновения для многих произведений искусства.
В нашем новом тексте много повторений слова "Кошка", давайте заменим, например, на "Собака". Воспользуемся командой:
$ sed 's/Кошка/Собака/' example1.txt
Как можно заметить, теперь в первом предложении вместо слова "Кошка" мы видим слово "Собака".

По умолчанию, sed затрагивает только первое вхождение слова из шаблона в каждой строке. Проверим это утверждение, давайте пополним example1.txt новой строкой:
Кошка - друг человека. Кошка с давних времен помогала людям в хозяйстве. Кошка была источником вдохновения для многих произведений искусства.
Кошка - это млекопитающее
Результат ниже, только первое вхождение слова изменилось в каждой строке.

Хорошо, а если нам нужно изменить только второе значение из строки? Легко:
$ sed 's/Кошка/Собака/2' example1.txt

А если третье?
$ sed 's/Кошка/Собака/3' example1.txt

Для замены всех вхождений заданного шаблона нужно воспользоваться ключом g (от англ. global - глобальный):
$ sed 's/Кошка/Собака/g' example1.txt

Следующая команда заменит в каждой строке второе, третье, четвёртое и т.д. вхождения слова "кошка" на слово "собака":
$ sed 's/Кошка/Собака/2g' example1.txt

Обратите внимание, что первое значение в каждой строке не изменилось. А можно ли внести корректировки только в нужную нам строку?
$ sed '3 s/Кошка/Собака/' example1.txt
Например, мы сменили значение только в третьей строке.

А если у нас текст с разным регистром? Можно ли sed настроить в игнорирование регистра? Конечно, с помощью ключа /i:
$ sed 's/Кошка/Собака/i' example1.txt
В этом случае неважно как написано слово "Кошка", оно будет заменено на слово "Собака".
Как вы можете заметить, sed по умолчанию, выводит весь правленный текст. Включая те строки, которые не были тронуты. Предположим, что текст, с которым мы работаем крайне большой, и читать его каждый раз - затруднительный процесс. С помощью команды:
$ sed 's/Кошка/Собака/p' example1.txt
Вы обнаружите только те строки, в которых были внесены изменения.

Помните особенность sed? Он меняет только первое вхождение в строке. Если нужно заменить везде, то добавьте ключ g:
$ sed 's/Кошка/Собака/pg' example1.txt

Наверное, у вас появился вопрос, а в чем же смысл ключа p, ведь получается что мы видим дубликаты строк? И текста на экране становится еще больше. Исправим это, добавив новый ключ '-n':
$ sed -n 's/Кошка/Собака/pg' example1.txt

Теперь видны только строки, где действительно изменяются значения.
Хорошо, мы отработали механизм замены, поговорим об удалении строк в файле? Например, выполним удаление 1-ой строки из текста:
$ sed '1d' example1.txt

А как выполнить удаление самой последней строки?
$ sed '$d' example1.txt
А можно ли указать диапазон удаляемых строк?
$ sed '3,6d' example1.txt
В этом случае будет выполнено удаление с 3 по 6 строку в вашем файле.
А удалить начиная с N-ой строки до конца?
$ sed '12,$d' example1.txt
А если нужно удалить не целые строки, а только те, где есть слово из шаблона?
$ sed '/Кошка/d' example1.txt
Попробуйте попрактиковаться самостоятельно!
Также, sed умеет вставлять пустые строки. Вероятно, задача редкая, но попробуйте в текст между каждой строкой вставить текст с помощью команды:
$ sed G example1.txt
А вот вставить две пустых строки можно следующей командой:
$ sed 'G;G' example1.txt
Или вставить пустую строку над каждой, где например есть искомое слово:
$ sed '/Кошка/{x;p;x;}' example1.txt

А как, например, вставить пустую строку под каждой, где есть искомое слово?
$ sed '/Кошка/G' example1.txt

Изучая сегодняшний материал, а также первый курс по Astra Linux, вы наверняка помните такие команды как cat, head, tail:

Легко вспомнить, что команда cat выводит вам весь файл, а head и tail либо его начало или конец соответственно. SED может вам помочь в просмотре документов с конкретных строк, например, с 1 по 5 строку:
$ sed -n '1,5y' example1.txt
Или с 13 по 18:
$ sed -n '13,18y' example1.txt
Или наоборот, вывести весь файл кроме строк, указанных в команде sed:
$ sed -n '1,4d' example1.txt
AWK или как быстро посмотреть таблицу любого размера
AWK - это си-подобный язык обработки входного потока данных по заданным шаблонам. По сути, это не просто команда, а настоящий язык программирования. С помощью него можно выполнять сложные операции поиска, парсинга и замены, а можно просто приручить его для использования в задачах по работе с текстом.
При использовании awk вы можете выбирать данные на основе заданного критерия. Это может быть поиск значений в табличных файлах, в структурированных файлах (например, в xml или html) или просто в тексте.
Базовая форма утилиты awk подразумевает описание основного действия в одинарных кавычках и фигурных скобках с указанием после него целевого файла:
$ awk '{действие}' example1.txt
Давайте подготовим такой структурированный файл:

Простой файл, столбцы в нём разделены табуляцией (нажмите Tab, при работе в текстовом редакторе). Файл представляет собой таблицу со сведениями о сотрудниках.
Начнем с первой простой задачи, например, пронумеруем строки в файле:
awk '{print NR,$0}' example1.txt

Давайте проверим, как через awk вызвать первый столбец файла:
awk '{print $1}' example1.txt

Получается, что $1 - переменная, которая указывает на первое значение в строках нашего файла. В тоже время $0 указывает на скрытое пространство в файле, в которое, как правило, записывается номер строки.
А что же делать, если нужно вывести второй столбец? Конечно, с помощью $2!
awk '{print $2}' example1.txt

По умолчанию, awk начало и конец каждого столбца определяет именно по пробелу.
А можно ли вывести сразу два столбца?
awk '{print $1, $2}' example1.txt

А как вывести последний столбец, при условии, что мы не знаем сколько всего столбцов в нашем файле?
awk '{print $NF}' example1.txt

А можно ли вывести не весь столбец, а лишь первые три его строки? Вот мы и столкнулись с несовершенством awk, самостоятельно данная утилита сделать такое не сможет, но в сочетании с утилитой head, например, ситуация кардинально изменяется!
awk '{print $1}' example1.txt | head -n 2

А можно ли вывести строку, которая бы начиналась с заданной буквы?
awk '/^Е/' example1.txt

Действие команды начинается с символа ^, который указывает на начало строки. После этого прописывается буква, с которой нужная вам строка должна начинаться.
По аналогичному принципу можно выводить строку, завершающуюся конкретным шаблоном:
awk '/к$/' example1.txt

Давайте, попробуем применить и прочие спецсимволы, которые мы сегодня изучили:
awk '! /^Е/' example1.txt

Как можно заметить, символ ! добавил в инверсию в указанную команду.
Для вывода слов, содержащих определённые буквы, а также слов, соответствующих указанному шаблону, мы снова используем прямые слэши. Например, если надо найти слова, содержащие "ов", мы напишем:
awk '/^ов/{print $0}' example1.txt

Давайте дополним наш файл example1.txt:

Теперь появился столбец, который хранит должность наших сотрудников. А теперь, сделаем выборку только по должности - Программист:
awk '/Программист/' example1.txt

А что если нам надо узнать только имена наших программистов?
awk '/Программист/{print $1,$2}' example1.txt

Предположим, что вы хотите найти информацию о сотрудниках разных возрастов:
awk '$3 < 30 {print $0}' example1.txt

Разберем данную команду подробнее: через $3 - вы указываете номер столбца, чьи значения планируете сравнивать. В нашем случае, мы ищем числа, которые будут меньше значения 30 из искомого столбца. print $0 - указывает, что вывести нужно первый символ строки - а это её номер! Вот и получается, что в данном случае будет произведен вывод этой самой строки.
Далее, приведем примеры, которые вероятно пригодятся вам в рабочей практике:
Большинство файлов вряд ли будут разделены пробелами, вероятно, вы уже встречались с файлами .csv формата, где разделителем является запятая. С помощью ключа -F awk можно сообщить о разделителе в искомом файле. Например, перед нами csv файл с именами пользователей и их компьютерами:

Выведем только первый и второй столбец этого файла:
awk -F ',' '{print $1,$2}' example1.txt

И вот уже перед нами файл аккуратно показывает два столбца искомого файла, ничего лишнего!
А если мы хотим посмотреть содержимое предпоследнего столбца?
awk -F ',' '{print $NF-1}' example1.txt

И тоже работает!
Практическая работа
- На полученной виртуальной машине, найдите файл "/opt/lab2.txt". С помощью утилиты awk, выведите в файл "/opt/users.txt" информацию о всех программистах из файла. Убедитесь, что в файле содержится информация о имени, фамилии, возрасте, городе проживания и должности человека.
- На полученной виртуальной машине, найдите файл "/opt/lab3.txt". Файл представляет собой снимок процессов, который был снят с реального компьютера. С помощью утилит grep или awk выведите информацию о PID процесса и потребляемом CPU. Вывести информацию нужно в файл "/opt/process.txt". Формат файла должен быть: 1400 (как PID) и 1.0 (как загрузка CPU).
- На полученной виртуальной машине, найдите файл "/opt/lab3.txt". Файл представляет собой снимок процессов, который был снят с реального компьютера. С помощью утилит grep или awk выведите информацию о PID процесса и потребляемом CPU всех процессов, которые запущены от пользователя, чьё имя начинается на ^h. Вывести информацию нужно в файл "/opt/process2.txt". Формат файла должен быть:

Вот и всё. Теперь у вас есть необходимая основа для начала работы с grep, awk и sed для управления текстовыми данными. В следующем материале вы познакомитесь с Дискреционным управлением доступа!
После завершения работы, для проверки выполнения работ - выполните команду
checker_system1
Благодарю за чтение и успехов вам в обучении!