С сортирането можете да подреждате файлове въз основа на реда в речника или по числова стойност, рандомизирате файлови редове, премахвате дублиращи се редове и проверявате дали файлът е сортиран.
Може да можете да правите други неща с него, но първо, нека се притесняваме да си увием главите как да използваме сортирането в bash скриптове.
Какво е сортиране?
Сортирането е външна команда, която обединява файлове, докато сортира съдържанието им според типа сортиране и записва резултатите от сортирането в стандартен изход.
Сортирайте командните опции за bash
Командата за сортиране се предлага с 31 опции (13 основни и 18 категоризирани като други). Повечето опитни програмисти на bash (дори експерти) знаят само няколко основни опции за сортиране, необходими за преминаване. Други рядко се докосват. За ваш късмет имаме време да ги докоснем всички.
Основни опции за сортиране
Това са опциите, които ви помагат да свършите нещата и да сортирате (Сортиране) в допълнение към манипулирането на сортираните резултати (Последваща обработка) и прилагането на филтри (Филтри) преди сортирането.
Сортиране
Сортирането се предлага с 5 различни вида сортиране. Ето таблица, показваща всеки тип сортиране със свързани опции.
Вид | Кратка опция / дълга опция / и т.н дума |
Числово сортиране (общо) | -g / -общо-числово-сортиране общо-числови подкрепа за научна нотация 0.1234e4 = 1234 |
Числово сортиране (човешко) | -h / -human-numeric-sort човешки-числови 1.234K = 1234 |
Числови | -n / -numeric-sort числови .. < -1 < 0 < 1 <… |
Месец | -M / -месечно сортиране месец Неизвестно < Jan < Feb <… < Nov < Dec |
Случайни | -r / -random-sort случайни |
Версия | -V / -version-sort версия |
Имайте предвид, че всеки тип сортиране има дълга опция, завършваща с -sort. В допълнение към конкретни опции за сортиране, опцията -sort = WORD може да се използва за сортиране по дума. Например -sort = random може да се използва вместо -random-sort или -r.
Примери
Ето някои примери за команди за сортиране за всеки метод за сортиране.
Пример) Сортиране на имена
Сортирането няма проблеми със сортирането на редове по азбучен ред. Помислете за списък на известни хора, които не са сортирани.
Функция
известни хора()curl --silent https: // www.биография онлайн.net / people / known-100.html
| grep след съдържание | sed -e 's /<[^>] *.// g '-e' s / WWII // 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, можем да използваме общо числово сортиране.
Функция
unsorted-numeric-values ()сл. 100 | сортиране - произволно сортиране | sed '3i 9e2' | sed '3i 99K'
Помислете за сортирания изход, като използвате всеки метод. Имайте предвид, че в допълнение към съдържанието на стойности от 1 до 100, списъкът включва също „9e12“ (900) и „99K“ (99000).
Командна линия
несортирани числови стойности | сортиране -nИзход
9697
98
99
99 000
100
Ами 900 и 99000. Точно така, просто е числово сортиране. Следващия.
Командна линия
несортирани числови стойности | сортиране -hИзход
9697
98
99
100
99 000
Ами 900. Точно така, това е просто човешко числово сортиране. Следващия.
Командна линия
несортирани числови стойности | сортиране -gИзход
9697
98
99
99 000
100
9е2
Ами 99000. Точно така, това е просто общо числово сортиране. Както виждате, в този случай няма метод за сортиране; това обаче не означава, че не можете да излезете с решение.
Командна линия
несортирани числови стойности | sed 's / [kK] / e3 /' | сортиране -gИзход
9697
98
99
100
9е2
99е3
Сега това е по-скоро така.
Пример) Човешко числово сортиране
Ако трябва да сортираме числови стойности, като вземем предвид значението на обозначения като K, G, M и E, можем да използваме човешко числово сортиране.
Командна линия
сл. 100 | сортиране - произволно сортиране | sed '3i 3k' | сортиране -hИзход
9697
98
99
100
3k
Пример) Числово сортиране
Ако всичко, от което се нуждаем, е да сортираме цели числа, числовото сортиране върши работа.
Командна линия
сл. 100 | сортиране - произволно сортиране | sort --numerics-sortИзход
9596
97
98
99
100
Пример) Месечно сортиране
Месечното сортиране ви позволява да поръчате редове по месец. Може да се окаже полезно за групиране на редове заедно по месец, особено в случай, че опцията за сортиране по време не е налична.
Функция
месеци ()котка <
Февр
Март
Април
Може
Юни
Юли
Август
Септември
Октомври
Ноем
Дек
EOF
Да предположим, че месеците не са сортирани.
Командна линия
месеци | сортиране - произволно сортиранеИзход
МартОктомври
Дек
Април
Може
Септември
Август
Ноем
Юли
Януари
Февр
Юни
Винаги можем да сортираме по месец.
Командна линия
месеци | сортиране - произволно сортиране | сортиране - месец-сортиранеИзход
ЯнуариФевр
Март
Април
Може
Юни
Юли
Август
Септември
Октомври
Ноем
Дек
Имайте предвид, че ако променим Dec на който и да е подниз през ноември да кажем „Novem“, той ще се появи след „Nov“ в сортирания изход.
Пример) Случайно сортиране - убийте терминал на някой друг
Както се очаква, произволното сортиране прави обратното на сортирането, смесва линии.
Да предположим, че за образователни цели искаме да убием друг потребител. Трябва да се уверим, че това не е нашето мнение и да рандомизираме списъците, така че да е по-хубаво и да можем да кажем, че ptys са избрани на случаен принцип.
Команди
message-pty ()местен pty;
pty = "$ 1"
;
echo -n "Ще влезете в"> / dev / $ pty;
за i в 5 4 3 2 1;
направете
сън 1;
echo -n "$ i"> / dev / $ pty;
Свършен;
ехо "Чао!"> / dev / $ pty;
сън 1
ps | grep pty | grep -v -e $ (mypty) | сортиране - произволно сортиране | глава -1> stdin;
message-pty $ (pty < stdin );
убий $ (pid < stdin )
Изход в чужд терминал
Слизаш след 5 4 3 2 1 Чао!]
(изход)
Пример) Сортиране на версия - ips за сортиране
Както знаете, изходните файлове могат да бъдат версирани с помощта на низове като 1.0. Освен това версиите могат да се задълбочат с номера на версиите като 1.0.0, каквито се виждат в популярните схеми за семантична версия.
Сортирането на версията ви позволява да сортирате номерата на версиите. Страхотен! Сега какво? Нека да го тестваме.
За този пример съм подготвил bash скрипт за генериране на произволни ips, за да не се налага да ходим там. Това е в репото. За тези от нас, които нямат репо, ето бърз старт.
Команди
git clone https: // github.com / temptemp3 / linuxhint.com.gitпсевдоним random-ips = 'test -f "linuxhint.com / generate-random-ips.sh "; баш $ _ '
Сега, когато сте готови, нека започнем.
Командна линия
произволни 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
Добре, работи. Сега нека видим какво се случва, когато се опитаме да сортираме ips.
Командна линия
сортиране на 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 в 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
15а14,15
> 44.27.108.172
> 44.221.43.20
27d26
< 84.218.132.51
29с28
< 87.137.131.40
Както виждате, сортирането на версиите ви позволява да сортирате номерата на версиите, когато други методи за сортиране са неуспешни.
Пример) Сортиране на версията - сортиране на имена на файлове с номера на версиите
Надграждайки последния пример, нека използваме сортиране на версията малко по-близо до предназначението. Както знаете, номерата на версиите често се появяват в имената на файловете. Вижте Подробности за сортирането на версията.
Първо, нека трансформираме ips в нещо друго, по-скоро като изходен файл на проекта.
Команди
алфа ()алфа = "abcdefghijklmnopqrstuvwxyz";
echo -n $ alpha: $ ((СЛУЧАЙЕН% 26)): 1
бета ()
алфа = "ab";
echo -n $ alpha: $ ((СЛУЧАЙЕН% 2)): 1
котки ips | докато чете -r ред; направете
echo $ (alpha) -v $ line $ (test $ ((RANDOM% 5)) -eq 0 || бета).катран.gz;
готово | тройник глътки
Изход
x-v56.16.109.54.катран.gzk-v117.38.14.165а.катран.gz
d-v87.59.32.91а.катран.gz
h-v115.215.64.100.катран.gz
s-v72.174.246.218б.катран.gz
h-v163.93.19.173.катран.gz
u-v184.225.11.92б.катран.gz
y-v205.53.5.211а.катран.gz
t-v175.196.164.17б.катран.gz
e-v167.42.221.178б.катран.gz
c-v126.54.190.189б.катран.gz
b-v169.180.221.131а.катран.gz
y-v210.125.170.231а.катран.gz
x-v71.56.120.9б.катран.gz
Упражнение
Направете горните команди да работят по-бързо с помощта на xargs
Вижте пример за това как да използвате командата xargs в bash скриптове.
Този път дори няма да се притесняваме да използваме някой от другите методи за сортиране.
Командна линия
сортиране -V глъткиИзход
d-v127.100.108.192.катран.gze-v62.140.229.42а.катран.gz
e-v149.77.211.215а.катран.gz
e-v167.42.221.178б.катран.gz
e-v194.189.236.29а.катран.gz
e-v198.145.199.84б.катран.gz
e-v240.1.147.196b.катран.gz
f-v50.100.142.42б.катран.gz
f-v117.58.230.116.катран.gz
f-v139.17.210.68б.катран.gz
f-v153.18.145.133б.катран.gz
g-v201.153.203.60б.катран.gz
g-v213.58.67.108.катран.gz
h-v5.206.37.224.катран.gz
Сега виждате, че сортирането на версиите може да бъде полезно при сортиране на имена на файлове с номера на версиите.
Предварително сортиране
Сортирането има четири основни опции, които засягат действителното сортиране, а именно: -ignore-водещи-заготовки, -ignore-case, -ignore-nonprinting и -dictionary-order, които могат или не могат да се припокриват. Следвайте пример с използване на всяка опция.
Сортирайте, игнорирайки водещите заготовки
Сортирането позволява като опция да се игнорират водещите заготовки. Водещите заготовки се запазват в сортирания изход.
Вариант
--игнориране на водещи заготовкиУпотреба
sort --ignore-водещи заготовкиКоманди
известни хора> fpкотка >> fp << EOF
Мерилин Монро (1926 - 1962)
Абрахам Линкълн (1809 - 1865)
EOF
котка fp | сортиране | tac
Изход
Алфред Хичкок (1899 - 1980)Алберт Айнщайн (1879 - 1955)
Ал Гор (1948 -)
Абрахам Линкълн (1809 - 1865)
Мерилин Монро (1926 - 1962)
Абрахам Линкълн (1809 - 1865)
Имайте предвид, че водещите интервали в редове, добавени към fp, се появяват първи в изхода за сортиране.
За да поправим това, трябва да игнорираме водещите заготовки, както следва.
Команди
известни хора> fpкотка >> fp << EOF
Мерилин Монро (1926 - 1962)
Абрахам Линкълн (1809 - 1865)
EOF
котка fp | сортиране --ignore-водещи-заготовки --ignore-водещи-заготовки | tac
Изход
Мерилин Монро (1926 - 1962)Мерилин Монро (1926 - 1962)
Мария Антоанета (1755 - 1793)
..
Алберт Айнщайн (1879 - 1955)
Ал Гор (1948 -)
Абрахам Линкълн (1809 - 1865)
Абрахам Линкълн (1809 - 1865)
Алтернативи
котка fp | sed 's / ^ \ s * //' | сортиране | tacОбърнете внимание, че алтернативата не запазва водещи празни места в изхода за сортиране.
Сортирай игнорирайки случая
Сортирането позволява да се игнорира входния регистър като опция. Случаят е запазен в сортирания изход.
Вариант
--ignore-caseУпотреба
sort --ignore-caseКоманди
известни хора> fpкотка >> fp << EOF
Абрахам Линкълн (1809 - 1865)
Абрахам Линкълн (1809 - 1865)
EOF
котка fp | сортиране | tac
Изход
Амелия Ърхарт (1897 - 1937)Алфред Хичкок (1899 - 1980)
Алберт Айнщайн (1879 - 1955)
Ал Гор (1948 -)
Абрахам Линкълн (1809 - 1865)
Абрахам Линкълн (1809 - 1865)
Обърнете внимание, че водещите интервали в редове, добавени към fp, се появяват първи в изхода за сортиране.
За да поправим това, трябва да игнорираме водещите заготовки, както следва.
Команди
известни хора> fpкотка >> fp << EOF
Абрахам Линкълн (1809 - 1865)
Абрахам Линкълн (1809 - 1865)
EOF
котка fp | sort --ignore-case | tac
Изход
Амелия Ърхарт (1897 - 1937)Алфред Хичкок (1899 - 1980)
Алберт Айнщайн (1879 - 1955)
Ал Гор (1948 -)
Абрахам Линкълн (1809 - 1865)
Абрахам Линкълн (1809 - 1865)
Абрахам Линкълн (1809 - 1865)
Алтернативи
котка fp | докато чете -r ред; do echo $ линия ,,; готово | сортиране | tacИмайте предвид, че алтернативата не запазва регистъра в изхода за сортиране.
Сортиране, игнорирайки непечат
Сортирането позволява да се игнорира въвеждането без отпечатване като опция. Неотпечатването се запазва в сортирания изход.
Вариант
--игнориране-непечатУпотреба
sort --ignore-nonprintingКоманди
известни хора> fpecho -e "\ x90Abe" >> fp
котка fp | сортиране | tac
Изход
Одри Хепбърн (1929 - 1993)Анджелина Джоли (1975 -)
Амелия Ърхарт (1897 - 1937)
Алфред Хичкок (1899 - 1980)
Алберт Айнщайн (1879 - 1955)
Ал Гор (1948 -)
Абрахам Линкълн (1809 - 1865)
Изглежда, че при въвеждането на сортирането липсва „Abe“ за непечатащи символи.
За да поправим това, трябва да игнорираме непечатащи символи.
Команди
известни хора> fpecho -e "\ x90Abe" >> fp
котка fp | sort --ignore-nonprinting | tac
[/ cc \
Изход
[cc lang = "bash"]
Амелия Ърхарт (1897 - 1937)
Алфред Хичкок (1899 - 1980)
Алберт Айнщайн (1879 - 1955)
Ал Гор (1948 -)
Абрахам Линкълн (1809 - 1865)
BeАбе
Сортирайте реда на речника
Сортирането позволява да се игнорират всички въведени данни, с изключение на интервалите и буквено-цифровите символи като опция. Входът се запазва в сортирания изход.
известни хора> fpecho -e "\ x90Abe" >> fp
котка fp | сортиране --d | tac
Сортиране на публикацията
Сортирането има една основна опция, която не засяга сортирането, а именно -reverse. Това обаче влияе на изхода, позволявайки превключване на реда между възходящ и низходящ. Следва пример.
Сортирайте обратния изход
Сортирането позволява опцията да се показва в обратен ред като опция.
Вариант
--обратенУпотреба
сортиране - обратноКомандна линия
известни хора | сортиране - обратноИзход
Анджелина Джоли (1975 -)Амелия Ърхарт (1897 - 1937)
Алфред Хичкок (1899 - 1980)
Алберт Айнщайн (1879 - 1955)
Ал Гор (1948 -)
Абрахам Линкълн (1809 - 1865)
Алтернативи
сортиране | tacДруги опции за сортиране
Има двадесет и две други опции за сортиране. Следват примери.
Проверка за сортиране
Сортирането има опция, която ви позволява да проверите дали входът е сортиран. Той се връща след първата инстанция на несортиран ред. В случай, че входът трябва да бъде сортиран, но вероятно вече е в ред, използването на проверка за сортиране е подходящо.
Вариант
--проверетеУпотреба
сортиране - проверкаКомандна линия
сл. 10 | сортиране - произволно сортиране | сортиране - проверкаИзход
сортиране: -: 3: разстройство: 10Командна линия
сл. 10 | сортиране - произволно сортиране | сортиране | сортиране - проверкаИзход
(празно)Сортирайте изхода
Сортирането има опция, която ви позволява да посочите файл, в който да пишете, вместо да използвате стандартен изход или пренасочване. Употребата му може да подобри съвместимостта в скриптова среда.
Вариант
--изход = ФАЙЛУпотреба
сортиране - изход = ФАЙЛКомандна линия
сл. 10 | sort --random-sort --output = random-10Изход
(празно)Сортиране нула прекратено
Сортирането има опция, която ви позволява да зададете разделителя на ред на нула вместо нов ред.
Вариант
--с нулев крайУпотреба
сортиране - нулев крайКомандна линия
сл. 10 | tr '\ 012' '\ 000' | сортиране - нулев край - произволно сортиранеИзход
25346178910Сортирайте стабилно
Сортирането има опция, която ви позволява да деактивирате сравнението в краен случай. В резултат на това могат да се постигнат по-стабилни времена на изпълнение в случай на достатъчно големи входове, които могат да доведат до нестабилно сортиране.
Вариант
--стабиленУпотреба
сортиране - стабилноКомандна линия
време sq 1000000 | сортиране - произволно сортиране | сортиране --стабилно> / dev / nullИзход
реално 0m9.138sпотребител 0m9.201s
sys 0m0.107s
Сортирай размера на буфера
Сортирането има опция, която ви позволява да зададете размера на паметта, използвана като буфер по време на сортиране. Може да се използва за ограничаване на консумацията на памет при сортиране на по-големи входове. Производителността може да бъде засегната.
Вариант
--размер на буфера = РАЗМЕРУпотреба
sort --buffer-size = 64Командна линия
време sq 1000000 | сортиране -случайно сортиране | сортиране -стабилен-буфер-размер = 64> / dev / null
Изход
реално 0m21.685sпотребител 0m9.858s
sys 0m2.092s
Сортирайте уникално
Сортирането има опция, която ви позволява да премахнете дублиращи се редове в изхода за сортиране
Вариант
--единствен по рода сиУпотреба
сортиране --уникалноКомандна линия ехо 1 2 2 4 5 | tr '\ 040' '\ 000' | сортиране - нулев край - уникален
Изход
1245Алтернативи
сортиране | uniqЗаключение
Сортирането е външна команда, полезна не само когато се използва в комбинация с други външни команди, но също така е полезна, когато се използва с команди без вграден метод за подреждане, като дефинирана от потребителя функция или bash скриптове като цяло.