С помощью сортировки вы можете упорядочивать файлы в соответствии с порядком в словаре или по числовому значению, рандомизировать строки файлов, удалять повторяющиеся строки и проверять, отсортирован ли файл.
Возможно, вы сможете делать с ним другие вещи, но сначала давайте побеспокоимся о том, как использовать сортировку в сценариях bash.
Что такое сорт?
Сортировка - это внешняя команда, которая объединяет файлы при сортировке их содержимого в соответствии с типом сортировки и записывает результаты сортировки в стандартный вывод.
Параметры команды сортировки для bash
Команда sort имеет 31 вариант (13 основных и 18 отнесенных к другим). Большинство опытных программистов на bash (даже эксперты) знают только несколько основных опций сортировки, необходимых для работы. К другим редко прикасаются. К счастью для вас, у нас есть время коснуться их всех.
Основные параметры сортировки
Это параметры, которые помогают выполнять задачи и сортировать (Сортировка), а также управлять отсортированными результатами (Постобработка) и применять фильтры (Фильтры) перед сортировкой.
Сортировка
Сортировка включает 5 различных типов сортировки. Вот таблица, показывающая каждый тип сортировки с соответствующими параметрами.
Сортировать | Короткий вариант / длинный вариант / и т. Д слово |
Числовая сортировка (общая) | -g / -general-numeric-sort общечисловой поддержка научных обозначений 0.1234e4 = 1234 |
Числовая сортировка (человек) | -h / -человеческая-числовая-сортировка человеко-числовой 1.234 КБ = 1234 |
Числовой | -n / -числовая сортировка числовой … < -1 < 0 < 1 <… |
Месяц | -М / -месяц-сортировка месяц Неизвестный < Jan < Feb <… < Nov < Dec |
Случайный | -г / -случайная-сортировка случайный |
Версия | -V / -версия-сортировка версия |
Обратите внимание, что у каждого типа сортировки есть длинный параметр, оканчивающийся на -sort. В дополнение к определенным параметрам сортировки, параметр -sort = WORD может использоваться для сортировки по словам. Например, -sort = random может использоваться вместо -random-sort или -r.
Примеры
Вот несколько примеров команд сортировки для каждого метода сортировки.
Пример) Сортировка имен
Сортировка не имеет проблем с сортировкой строк по алфавиту. Рассмотрим список известных людей без сортировки.
Функция
известные люди()curl - тихий https: // www.биографияонлайн.net / люди / известные-100.html
| grep post-content | sed -e 's /<[^>] *.// g '-e' s / Вторая мировая война // g '-e' s / \ (Wilbur \)
/ \ 1 Райт / '| grep -o -e '\ (\ ([A-Z] \ + [.] \?\) \ + [a-z] * \ s \) \ + ([0-9] \ + \ s [^)] \+.'
Командная строка
известные люди | СортироватьВыход
Стивен Кинг (1947 -)Стив Джобс (1955 - 2012)
Стинг (1951 -)
Тайгер Вудс (1975 -)
Том Круз (1962 -)
Усэйн Болт (1986 -)
Винчи (1452 - 1519)
Уолт Дисней (1901-1966)
Уилбур Райт (1867-1912)
Вудро Вильсон (1856-1924)
Пример) Общая числовая сортировка
Если нам нужно отсортировать числовые значения с учетом научных обозначений, таких как 99e2, мы можем использовать общую числовую сортировку.
Функция
неотсортированные числовые-значения ()seq 100 | sort --случайная сортировка | sed '3i 9e2' | сед '3i 99K'
Рассмотрите отсортированный вывод, используя каждый метод. Обратите внимание, что помимо значений от 1 до 100, список также включает «9e12» (900) и «99K» (99000).
Командная строка
неотсортированные числовые значения | sort -nВыход
9697
98
99
99 тыс
100
А как насчет 900 и 99000. Правильно, это просто числовая сортировка. Следующий.
Командная строка
неотсортированные числовые значения | sort -hВыход
9697
98
99
100
99 тыс
А как насчет 900. Правильно, это просто человеческая числовая сортировка. Следующий.
Командная строка
неотсортированные числовые значения | sort -gВыход
9697
98
99
99 тыс
100
9e2
А как насчет 99000. Правильно, это просто обычная числовая сортировка. Как видите, в этом случае нет совместимого метода сортировки; однако это не значит, что вы не можете придумать исправление.
Командная строка
неотсортированные числовые значения | sed 's / [kK] / e3 /' | sort -gВыход
9697
98
99
100
9e2
99e3
Теперь это больше похоже на это.
Пример) Сортировка по числовому значению
Если нам нужно отсортировать числовые значения с учетом значений таких обозначений, как K, G, M и E, мы можем использовать числовую сортировку человека.
Командная строка
seq 100 | sort --случайная сортировка | sed '3i 3k' | sort -hВыход
9697
98
99
100
3k
Пример) Числовая сортировка
Если все, что нам нужно, это сортировать целые числа, числовая сортировка делает свое дело.
Командная строка
seq 100 | sort --случайная сортировка | sort --numerics-sortВыход
9596
97
98
99
100
Пример) Сортировка по месяцам
Сортировка по месяцам позволяет упорядочивать строки по месяцам. Это может оказаться полезным для группировки строк по месяцам, особенно в случае, если опция сортировки по времени недоступна.
Функция
месяцы ()Кот <
Фев
Мар
Апр
Может
Июн
Июл
Авг
Сен
Октябрь
Ноя
Декабрь
EOF
Предположим, что месяцы не отсортированы.
Командная строка
месяцев | sort --random-sortВыход
МарОктябрь
Декабрь
Апр
Может
Сен
Авг
Ноя
Июл
Янв
Фев
Июн
Мы всегда можем отсортировать по месяцам.
Командная строка
месяцев | sort --случайная сортировка | sort --month-sortВыход
ЯнвФев
Мар
Апр
Может
Июн
Июл
Авг
Сен
Октябрь
Ноя
Декабрь
Обратите внимание, что если мы изменим Dec на любую подстроку в ноябре, скажем «Novem», она появится после «Nov» в отсортированном выводе.
Пример) Случайная сортировка - убить чужой терминал
Как и ожидалось, случайная сортировка работает противоположно сортировке, смешивает строки.
Предположим, что в образовательных целях мы хотим убить другого пользователя. Нам нужно будет убедиться, что это не наша точка зрения, и рандомизировать списки, чтобы они были лучше и чтобы мы могли сказать, что точки были выбраны случайным образом.
Команды
сообщение-pty ()местная птичка;
pty = "$ 1"
;
echo -n "Вы идете вниз"> / dev / $ pty;
для i в 5 4 3 2 1;
делать
сон 1;
echo -n "$ i"> / dev / $ pty;
Выполнено;
echo "Пока!"> / dev / $ pty;
спать 1
пс | grep pty | grep -v -e $ (mypty) | sort --случайная сортировка | голова -1> стандартный ввод;
сообщение-pty $ (pty < stdin );
убить $ (pid < stdin )
Вывод в чужой терминал
Вы идете вниз через 5, 4, 3, 2, 1, пока!]
(выход)
Пример) Сортировка версий - сортировка IPS
Как вы знаете, исходные файлы могут быть версированы с помощью таких строк, как 1.0. Кроме того, версии могут быть более глубокими с номерами версий, такими как 1.0.0, например, в популярных схемах семантических версий.
Сортировка версий позволяет сортировать номера версий. большой! Что теперь? Давай проверим это.
Для этого примера я подготовил сценарий bash для генерации случайных IP-адресов, чтобы нам не приходилось туда идти. Это в репо. Для тех из нас, у кого нет репо, вот быстрый старт.
Команды
git clone https: // github.com / temptemp3 / linuxhint.ком.мерзавецпсевдоним random-ips = 'test -f "linuxhint.com / generate-random-ips.sh "; bash $ _ '
Теперь, когда вы готовы, приступим.
Командная строка
random-ips 200 | тройник ipsВыход
199.174.177.98180.33.247.107
87.130.125.109
76.86.8.20
162.41 год.183.150
226.58.10.196
83.121.11.145
80.199.197.19
44 год.214.89.52
185.174.143.111
Хорошо работает. Теперь посмотрим, что произойдет, когда мы попробуем отсортировать IP-адреса.
Командная строка
сортировать IPSВыход
76.88.194.1578.96.11.181
82.169.213.206
84.218.132.51
84.3.101.97
87.137.131.40
87.59.32.91
89.149.111.242
97.121.162.244
98.145.130.186
На первый взгляд кажется, что это работает, но строки вроде 8.96.11.181 должен появиться в другом месте.
Команды
для o in d h n V g M
делать
сортировать ips - $ o> ips $ o ,,
Выполнено
эхо все виды равная числовая сортировка
diff ips n, d 1> / dev / null || эхо порядок словаря != числовая сортировка
diff ips n, h 1> / dev / null || эхо человеческая числовая сортировка != числовая сортировка
diff ips n, g 1> / dev / null || эхо общая числовая сортировка != числовая сортировка
diff ips n, v 1> / dev / null ||
эхо версия сортировка != числовая сортировка
show_n_v_ips_diff = "правда"
контрольная работа ! "$ show_n_v_ips_diff" || diff ips n, v
Выход
все виды равные числовые сортировкипорядок словаря != числовая сортировка
сортировка версий != числовая сортировка
13,14d12
< 44.221.43.20
< 44.27.108.172
15a14,15
> 44.27.108.172
> 44.221.43 год.20
27d26
< 84.218.132.51
29c28
< 87.137.131.40
Как видите, сортировка версий позволяет сортировать номера версий, когда другие методы сортировки не работают.
Пример) Сортировка версий - сортировка имен файлов по номерам версий
Основываясь на последнем примере, давайте использовать сортировку версий немного ближе к ее предполагаемому использованию. Как вы знаете, номера версий обычно появляются в именах файлов. См. Подробности о сортировке версий.
Во-первых, давайте преобразуем ips в нечто большее, чем исходный файл проекта, например.
Команды
alpha ()альфа = "abcdefghijklmnopqrstuvwxyz";
echo -n $ альфа: $ ((СЛУЧАЙНОЕ% 26)): 1
beta ()
альфа = "ab";
echo -n $ альфа: $ ((СЛУЧАЙНОЕ% 2)): 1
кошка ips | при чтении -r строка; делать
echo $ (alpha) -v $ line $ (тест $ ((RANDOM% 5)) -eq 0 || beta).деготь.gz;
сделано | тройник глотки
Выход
x-v56.16.109.54.деготь.gzк-v117.38.14.165a.деготь.gz
d-v87.59.32.91a.деготь.gz
h-v115.215.64.100.деготь.gz
s-v72.174.246.218b.деготь.gz
h-v163.93.19.173.деготь.gz
u-v184.225.11.92b.деготь.gz
y-v205.53.5.211a.деготь.gz
т-v175.196.164.17b.деготь.gz
e-v167.42.221.178b.деготь.gz
c-v126.54.190.189b.деготь.gz
b-v169.180.221.131a.деготь.gz
y-v210.125.170.231a.деготь.gz
x-v71.56.120.9b.деготь.gz
Упражнение
Сделайте приведенные выше команды быстрее с помощью xargs
См. Пример использования команды xargs в сценариях bash.
На этот раз мы даже не будем использовать какие-либо другие методы сортировки.
Командная строка
sort -V sipsВыход
d-v127.100.108.192.деготь.gze-v62.140.229.42а.деготь.gz
e-v149.77.211.215a.деготь.gz
e-v167.42.221.178b.деготь.gz
e-v194.189.236.29а.деготь.gz
e-v198.145.199.84b.деготь.gz
e-v240.1.147.196b.деготь.gz
f-v50.100.142.42b.деготь.gz
f-v117.58.230.116.деготь.gz
f-v139.17.210.68b.деготь.gz
f-v153.18.145.133b.деготь.gz
g-v201.153.203.60b.деготь.gz
g-v213.58.67.108.деготь.gz
h-v5.206.37.224.деготь.gz
Теперь вы видите, что сортировка версий может быть полезна при сортировке имен файлов по номерам версий.
Предварительная сортировка
Сортировка имеет четыре основных параметра, которые влияют на фактическую сортировку, а именно -ignore-lead-blanks, -ignore-case, -ignore-nonprinting и -dictionary-order, которые могут перекрываться, а могут и не совпадать. Ниже приведены примеры использования каждого варианта.
Сортировка игнорируя начальные пробелы
Сортировка позволяет игнорировать начальные пробелы ввода как вариант. Начальные пробелы сохраняются в отсортированном выводе.
Вариант
--игнорировать ведущие пробелыПрименение
sort --ignore-lead-blanksКоманды
известные люди> fpкошка >> fp << EOF
Мэрилин Монро (1926-1962)
Авраам Линкольн (1809 - 1865)
EOF
кот fp | сортировать | такс
Выход
Альфред Хичкок (1899-1980)Альберт Эйнштейн (1879-1955)
Эл Гор (1948 -)
Авраам Линкольн (1809 - 1865)
Мэрилин Монро (1926-1962)
Авраам Линкольн (1809 - 1865)
Обратите внимание, что ведущие пробелы в строках, добавленных к fp, появляются первыми в выводе сортировки.
Чтобы исправить это, нам нужно игнорировать ведущие пробелы следующим образом.
Команды
известные люди> fpкошка >> fp << EOF
Мэрилин Монро (1926-1962)
Авраам Линкольн (1809 - 1865)
EOF
кот fp | сортировка --ignore-lead-blanks --ignore-leading-blanks | такс
Выход
Мэрилин Монро (1926-1962)Мэрилин Монро (1926-1962)
Мария-Антуанетта (1755 - 1793)
…
Альберт Эйнштейн (1879-1955)
Эл Гор (1948 -)
Авраам Линкольн (1809 - 1865)
Авраам Линкольн (1809 - 1865)
Альтернативы
кот fp | sed 's / ^ \ s * //' | сортировать | таксОбратите внимание, что альтернатива не сохраняет ведущие пробелы в выводе сортировки.
Сортировка без учета регистра
Сортировка позволяет игнорировать регистр ввода в качестве опции. Регистр сохраняется в отсортированном выводе.
Вариант
--игнорировать регистрПрименение
sort --ignore-caseКоманды
известные люди> fpкошка >> fp << EOF
Авраам Линкольн (1809 - 1865)
Авраам Линкольн (1809 - 1865)
EOF
кот fp | сортировать | такс
Выход
Амелия Эрхарт (1897-1937)Альфред Хичкок (1899-1980)
Альберт Эйнштейн (1879-1955)
Эл Гор (1948 -)
Авраам Линкольн (1809 - 1865)
Авраам Линкольн (1809 - 1865)
Обратите внимание, что ведущие пробелы в строках, добавленных к fp, появляются первыми в выводе сортировки.
Чтобы исправить это, нам нужно игнорировать ведущие пробелы следующим образом.
Команды
известные люди> fpкошка >> fp << EOF
Авраам Линкольн (1809 - 1865)
Авраам Линкольн (1809 - 1865)
EOF
кот fp | sort --ignore-case | такс
Выход
Амелия Эрхарт (1897-1937)Альфред Хичкок (1899-1980)
Альберт Эйнштейн (1879-1955)
Эл Гор (1948 -)
Авраам Линкольн (1809 - 1865)
Авраам Линкольн (1809 - 1865)
Авраам Линкольн (1809 - 1865)
Альтернативы
кот fp | при чтении -r строка; сделать echo $ line ,,; сделано | сортировать | таксОбратите внимание, что альтернатива не сохраняет регистр в выводе сортировки.
Сортировка игнорируя непечатаемые
Сортировка позволяет игнорировать ввод без печати в качестве опции. Непечатаемые данные сохраняются в отсортированном выводе.
Вариант
--игнорировать-непечатаемыйПрименение
sort --ignore-nonprintingКоманды
известные люди> fpecho -e "\ x90Abe" >> fp
кот fp | сортировать | такс
Выход
Одри Хепберн (1929 - 1993)Анджелина Джоли (1975 -)
Амелия Эрхарт (1897-1937)
Альфред Хичкок (1899-1980)
Альберт Эйнштейн (1879-1955)
Эл Гор (1948 -)
Авраам Линкольн (1809 - 1865)
Похоже, нам не хватает команды Abe для непечатаемых символов во вводе сортировки.
Чтобы исправить это, нам нужно игнорировать непечатаемые символы.
Команды
известные люди> fpecho -e "\ x90Abe" >> fp
кот fp | sort --ignore-nonprinting | такс
[/ cc \
Выход
[cc lang = "bash"]
Амелия Эрхарт (1897-1937)
Альфред Хичкок (1899-1980)
Альберт Эйнштейн (1879-1955)
Эл Гор (1948 -)
Авраам Линкольн (1809 - 1865)
▒Абе
Порядок сортировки словаря
Сортировка позволяет игнорировать весь ввод, кроме пробелов и буквенно-цифровых символов в качестве опции. Ввод сохраняется в отсортированном выводе.
известные люди> fpecho -e "\ x90Abe" >> fp
кот fp | sort --d | такс
Сортировка сообщений
У сортировки есть одна основная опция, которая не влияет на сортировку, а именно -reverse. Однако это влияет на вывод, позволяя переключать порядок между возрастанием и убыванием. Пример следует.
Сортировка обратного вывода
Сортировка позволяет отображать выходные данные в обратном порядке в качестве опции.
Вариант
--обеспечить регрессПрименение
sort --reverseКомандная строка
известные люди | sort --reverseВыход
Анджелина Джоли (1975 -)Амелия Эрхарт (1897-1937)
Альфред Хичкок (1899-1980)
Альберт Эйнштейн (1879-1955)
Эл Гор (1948 -)
Авраам Линкольн (1809 - 1865)
Альтернативы
сортировать | таксДругие варианты сортировки
Есть еще двадцать два варианта сортировки. Примеры следуют.
Проверить сортировку
У сортировки есть опция, которая позволяет вам проверить, отсортирован ли ввод. Он возвращается после первого экземпляра несортированной строки. В случае, если вводимые данные необходимо отсортировать, но они, скорее всего, уже упорядочены, можно использовать проверку сортировки.
Вариант
--проверятьПрименение
сортировать - проверитьКомандная строка
seq 10 | sort --случайная сортировка | сортировать - проверитьВыход
сортировка: -: 3: беспорядок: 10Командная строка
seq 10 | sort --случайная сортировка | сортировать | сортировать - проверитьВыход
(пустой)Сортировать вывод
Сортировка имеет параметр, который позволяет указать файл для записи вместо использования стандартного вывода или перенаправления. Его использование может улучшить совместимость между средами сценариев.
Вариант
--output = FILEПрименение
sort --output = ФАЙЛКомандная строка
seq 10 | sort --random-sort --output = random-10Выход
(пустой)Сортировка с нулевым завершением
У сортировки есть опция, которая позволяет вам установить разделитель строк на нуль вместо новой строки.
Вариант
--с нулевым окончаниемПрименение
sort - с нулевым завершениемКомандная строка
seq 10 | tr '\ 012' '\ 000' | sort - с нулевым завершением --random-sortВыход
25346178910Сортировка стабильная
У сортировки есть опция, позволяющая отключить сравнение в крайнем случае. В результате может быть достигнуто более стабильное время выполнения в случае достаточно больших входных данных, что может привести к нестабильной работе сортировки.
Вариант
--стабильныйПрименение
sort --stableКомандная строка
time seq 1000000 | sort --случайная сортировка | сортировка - стабильный> / dev / nullВыход
реальный 0m9.138 спользователь 0m9.201-е годы
sys 0m0.107 с
Размер буфера сортировки
У сортировки есть опция, которая позволяет вам установить объем памяти, используемой в качестве буфера при сортировке. Его можно использовать для ограничения потребления памяти при сортировке больших входов. Это может повлиять на производительность.
Вариант
--размер буфера = РАЗМЕРПрименение
sort --buffer-size = 64Командная строка
time seq 1000000 | сортировка-случайная-сортировка | sort -stable -buffer-size = 64> / dev / null
Выход
реальный 0m21.685спользователь 0m9.858с
sys 0m2.092с
Сортировать по уникальному
Сортировка имеет параметр, позволяющий удалять повторяющиеся строки в выводе сортировки
Вариант
--уникальныйПрименение
сорт --уникальныйКомандная строка эхо 1 2 2 4 5 | tr '\ 040' '\ 000' | sort - с нулевым окончанием --unique
Выход
1245Альтернативы
сортировать | уникальныйЗаключение
Сортировка - это внешняя команда, полезная не только при использовании в сочетании с другими внешними командами, но и при использовании с командами без встроенного метода упорядочивания, такими как определяемая пользователем функция или сценарии bash в целом.