Фильтры в Linux

  1. Один из основополагающих принципов Linux заключается в том, что каждый элемент должен выполнять только одну функцию и что все элементы можно с легкостью объединять друг с другом. Эти элементы — строительные блоки, которые можно собирать и таким образом строить все, что мы захотим. В этой и следующих статьях мы поговорим о конкретных строительных блоках. Первый из них — фильтры.

    Что такое фильтры

    Фильтры— это команды, которые преобразуют переданные текстовые данные определенным образом. 

    С помощью фильтров можно брать необработанные данные, которые хранятся в файлы, и управлять ими — приводить в удобный для нас вид.

    В примерах ниже мы будем вводить данные через файл, но в будущих статьях обсудим, как это можно сделать иначе.

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

    1. user@bash: cat mysampledata.txt
    2. Вася яблоки 20
    3. Ксюша апельсины 5
    4. Игорь арбузы 12
    5. Рома груши 4
    6. Тимофей апельсины 9
    7. Лиза персики 7
    8. Ксюша апельсины 5
    9. Игорь виноград 39
    10. Аня манго 7
    11. Гриша ананасы 3
    12. Коля дыни 2
    13. Катя лаймы 14
    14. user@bash: 

    head

    head — это команда, которая печатает первые несколько строк ввода. По умолчанию она напечатает первые 10 строк, но это можно изменить с помощью аргумента. 

    В общем виде команда head используется следующим образом:

    head [-количество строк] [путь]

    Давайте выведем первые 4 строки из файла mysampledata.txt.

    1. user@bash: head -4 mysampledata.txt
    2. Вася яблоки 20
    3. Ксюша апельсины 5
    4. Игорь арбузы 12
    5. Рома груши 4
    6. user@bash: 

    tail

    tail — команда, которая печатает последние строки ввода. По умолчанию она также напечатает 10 последний строк. Количество также можно изменить с помощью аргумента.

    В общем виде команда tail используется следующим образом:

    tail [-количество строк] [путь]

    Теперь давайте выведем последние 3 строки файла mysampledata.txt.

    1. user@bash: tail -3 mysampledata.txt
    2. Гриша ананасы 3
    3. Коля дыни 2
    4. Катя лаймы 14
    5. user@bash: 

    sort

    sort — это команда, которая по умолчанию сортирует введенные данные по алфавиту. У нее много дополнительных возможностей, которые реализуются с помощью аргументов. Подробнее об этих возможностях вы можете прочитать сами в соответствующей строке руководства. 

    В общем виде команда sort используется следующим образом:

    sort [-параметры] [путь]

    Давайте отсортирует строки нашего файла mysampledata.txt по алфавиту.

    1. user@bash: sort mysampledata.txt
    2. Аня манго 7
    3. Вася яблоки 20
    4. Гриша ананасы 3
    5. Игорь арбузы 12
    6. Игорь виноград 39
    7. Катя лаймы 14
    8. Коля дыни 2
    9. Ксюша апельсины 5
    10. Ксюша апельсины 5
    11. Лиза персики 7
    12. Рома груши 4
    13. Тимофей апельсины 9
    14. user@bash:

    nl

    nl (сокращение от number lines) — это команда, которая нумерует строки вывода.

    В общем виде команда nl используется следующим образом:

    nl [-параметры] [путь]

    1. user@bash: nl mysampledata.txt
    2. 1 Вася яблоки 20
    3. 2 Ксюша апельсины 5
    4. 3 Игорь арбузы 12
    5. 4 Рома груши 4
    6. 5 Тимофей апельсины 9
    7. 6 Лиза персики 7
    8. 7 Ксюша апельсины 5
    9. 8 Игорь виноград 39
    10. 9 Аня манго 7
    11. 10 Гриша ананасы 3
    12. 11 Коля дыни 2
    13. 12 Катя лаймы 14
    14. user@bash: 

    Базовое форматирование не всегда будет подходить для ваших задач. Например, иногда нужно добавить после номера строки точку. Давайте это и сделаем с помощью пары дополнительного параметра. 

    1. user@bash: nl -s '. ' -w 10 mysampledata.txt
    2.          1.  Вася яблоки 20
    3.          2. Ксюша апельсины 5
    4.          3. Игорь арбузы 12
    5.          4. Рома груши 4
    6.          5. Тимофей апельсины 9
    7.          6. Лиза персики 7
    8.          7. Ксюша апельсины 5
    9.          8. Игорь виноград 39
    10.          9. Аня манго 7
    11.          10. Гриша ананасы 3
    12.          11. Коля дыни 2
    13.          12. Катя лаймы 14
    14. user@bash: 

    Точки добавились, но строки почему-то съехали. Посмотрите внимательно на пример выше и попробуйте сами понять, в чем дело. 

    В примере выше мы использовали два параметра: -s и -w

    • Параметр -s указывает, что нужно добавить после номера строки. Мы указали точку с пробелом — в командной строке это нужно было записать в кавычках.  
    • Параметр -w добавляет отступы. Мы указали 10 — Linux поставил 10 пробелов. 

    wc

    wc (сокращение от word count) — это команда, которая считает количество слов, символов или строк. По умолчанию wc выведет все три цифры. 

    1. user@bash: wc mysampledata.txt
    2. 12 36 195 mysampledata.txt
    3. user@bash: 

    Но все три значения нужны не всегда. Если после команды wc написать -l, команда выведет только количество строк. 

    1. user@bash: wc -l mysampledata.txt
    2. 12 mysampledata.txt
    3. user@bash:

    Параметры -w и -m выведут по отдельности количество слов и символов соответственно. 

    Давайте попробуем указать сразу несколько параметров одновременно.

    1. user@bash: wc -lw mysampledata.txt
    2. 12 36 mysampledata.txt
    3. user@bash:

    cut

    cut — это команда, которая вырезает определенные столбцы из переданных текстовых данных. 

    В общем случае команда cut используется следующим образом:

    cut [-параметры] [путь]

    В нашем примере — 3 столбца. Давайте прикажем командой строке вывести только первый — имена.

    1. user@bash: cut -f 1 -d ' ' mysampledata.txt
    2. Вася
    3. Ксюша
    4. Игорь
    5. Рома
    6. Тимофей
    7. Лиза
    8. Ксюша
    9. Игорь
    10. Аня
    11. Гриша
    12. Коля
    13. Катя
    14. user@bash: 

    По умолчанию cut считает, что столбцы разделены табами. В нашем же файле столбцы разделяются пробелами. Чтобы сказать об этом командной строке, мы использовали параметр -d, рядом с которым в одинарных кавычках указали, чем разделены столбцы. 

    Параметр -f позволяет указать командной строке, какой столбце нужно вывести. Если нужно вывести на экран 2 или больше столбцов, можно указывать их номера через запятую, как в примере ниже.

    1. user@bash: cut -f 1,2 -d ' ' mysampledata.txt
    2. Вася яблоки
    3. Ксюша апельсины
    4. Игорь арбузы
    5. Рома груши
    6. Тимофей апельсины
    7. Лиза персики
    8. Ксюша апельсины
    9. Игорь виноград
    10. Аня манго
    11. Гриша ананасы
    12. Коля дыни
    13. Катя лаймы
    14. user@bash: 

    sed

    sed (сокращение от stream editor) — это команда, которая умеет искать и заменять данные. Эта очень мощная команда, у нее много потенциала. Но в рамках этой статьи мы рассмотрим только ее базовое поведение.

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

    sed <выражение> [путь]

    Базовый вид выражения выглядит вот так:

    s/найти/заменить на/g
    • Первая буква s означает действие, которое нужно выполнить. s = substitute = заменить.
    • После первой косой черты / мы записываем то, что нужно найти и поменять. 
    • После второй косой черты / мы записываем то, на что нужно заменить найденную подстроку. 
    • Буква g в конце означает global, то есть поиск и замена будет осуществляться глобально. В нашем случае это не играет никакой роли, и g можно спокойно опустить. 

    Разберем пример. Допустим, у нас закончились апельсины, и ребятам из файла mysampledata.txt мы хотим заменить все апельсины на бананы. 

    1. user@bash: sed 's/апельсины/бананы/g' mysampledata.txt
    2. Вася яблоки 20
    3. Ксюша бананы 5
    4. Игорь арбузы 12
    5. Рома груши 4
    6. Тимофей бананы 9
    7. Лиза персики 7
    8. Ксюша бананы 5
    9. Игорь виноград 39
    10. Аня манго 7
    11. Гриша ананасы 3
    12. Коля дыни 2
    13. Катя лаймы 14
    14. user@bash: 

    Важно отметить, что sed не воспринимает слова, она работает со строками, которые состоят из символов. Попробуйте прогнать приведенные выше пример самостоятельно, заменив все апельсины на ны, и вы поймете, о чем идет речь. 

    Также обратите внимание, что мы заключили выражение в одинарные кавычки. Это необходимо, чтобы любые включенные в него символы, которые могут иметь особое значение в Linux, не обрабатывались командной строкой как команды или параметры, а передавались в sed.

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

    uniq

    uniq (сокращение от unique, уникальный) — это команда, которая удаляет повторяющиеся строки. С одним важным ограничением: удаляемые символы должны стоять рядом друг с другом.

    В общем виде команда uniq используется следующим образом:

    uniq [параметры] [путь]

    Давайте представим, что в нашем файле после обновления ПО появились ошибки. Вот, как он выглядит теперь:

    1. user@bash: cat mysampledata.txt
    2. Вася яблоки 20
    3. Ксюша апельсины 5
    4. Ксюша апельсины 5
    5. Ксюша апельсины 5
    6. Игорь арбузы 12
    7. Рома груши 4
    8. Тимофей апельсины 9
    9. Лиза персики 7
    10. Ксюша бананы 12
    11. Игорь виноград 39
    12. Игорь виноград 39
    13. Аня манго 7
    14. Гриша ананасы 3
    15. Коля дыни 2
    16. Катя лаймы 14
    17. user@bash: 

    Исправить ошибку нам поможет команда uniq. С ее помощью мы сейчас просто удалим продублировавшиеся строчки.

    1. user@bash: uniq mysampledata.txt
    2. Вася яблоки 20
    3. Ксюша апельсины 5
    4. Игорь арбузы 12
    5. Рома груши 4
    6. Тимофей апельсины 9
    7. Лиза персики 7
    8. Ксюша апельсины 12
    9. Игорь виноград 39
    10. Аня манго 7
    11. Гриша ананасы 3
    12. Коля дыни 2
    13. Катя лаймы 14
    14. user@bash: 

    tac 

    tac — это команда, обратная команде cat. Она выводит на экран файл с конца, т. е. первой напечатается последняя строчка и так далее. 

    В общем виде команда tac используется следующим образом:

    tac [путь]

    Давайте «перевернем» наш список из файла mysampledata.txt.

    1. user@bash: tac mysampledata.txt
    2. Катя лаймы 14
    3. Коля дыни 2
    4. Гриша ананасы 3
    5. Аня манго 7
    6. Игорь виноград 39
    7. Ксюша апельсины 12
    8. Лиза персики 7
    9. Тимофей апельсины 9
    10. Рома груши 4
    11. Игорь арбузы 12
    12. Ксюша апельсины 5
    13. Вася яблоки 20
    14. user@bash: 

    Практические задания

    1. Создайте файл с данными, похожий на тот, что мы использовали в этой статье.
    2. Поэкспериментируйте с каждой из рассмотренных команд. Убедитесь, что вы используете как относительные, так и абсолютные пути.
    3. Посмотрите страницы руководства каждой команды и попробуйте использовать хотя бы по два параметра для каждой.
codechick

СodeСhick.io - простой и эффективный способ изучения программирования.

2024 ©