sort
השמיים sort התוכנית ממיינת את התוכן של קלט סטנדרטי, או קובץ אחד או יותר המצוין בשורת הפקודה, ושולחת את התוצאות לפלט סטנדרטי. תוך שימוש באותה טכניקה שבה השתמשנו חתול, אנו יכולים להדגים עיבוד של קלט סטנדרטי ישירות מהמקלדת:
[me@linuxbox ~]$ מיון > foo.txt
cba
[me@linuxbox ~]$ cat foo.txt
abc
[me@linuxbox ~]$ מיון > foo.txt
cba
[me@linuxbox ~]$ cat foo.txt
abc
לאחר הזנת הפקודה, נקליד את האותיות "c", "b" ו-"a", ואחריהן שוב Ctrl-d כדי לציין את סוף הקובץ. לאחר מכן אנו רואים את הקובץ שהתקבל ורואים שהשורות מופיעות כעת בסדר ממוין.
השאלה היא איך? sort יכול לקבל קבצים מרובים בשורת הפקודה כארגומנטים, זה אפשרי למזג מספר קבצים לכדי שלם ממוין אחד. לדוגמה, אם היו לנו שלושה קבצי טקסט ורצינו לשלב אותם לקובץ אחד ממוין, נוכל לעשות משהו כמו זה:
מיון file1.txt file2.txt file3.txt > final_sorted_list.txt
מיון file1.txt file2.txt file3.txt > final_sorted_list.txt
ל- sort יש כמה אפשרויות מעניינות. הנה רשימה חלקית:
טבלה 20-1: אפשרויות מיון נפוצות
אפשרות | אופציה ארוכה | תיאור |
-b | --התעלם מהחסרים-מובילים | כברירת מחדל, המיון מתבצע על |
כל הקו, החל מה- | ||
הדמות הראשונה בשורה. זֶה | ||
האפשרות גורמת להתעלמות ממיון | ||
מובילים חללים בקווים ו | ||
מחשבת מיון על סמך הראשון | ||
תו ללא רווח לבן ב- | ||
קו. | ||
-f | --התעלם ממקרה | הופך את המיון לבלתי רגיש לאותיות גדולות. |
-n | --מיון מספרי | מבצע מיון על סמך הערכה מספרית של מחרוזת. שימוש באפשרות זו מאפשר לבצע מיון על ערכים מספריים ולא על ערכים אלפביתיים. |
-r | --לַהֲפוֹך | מיון בסדר הפוך. התוצאות נמצאות |
יורד ולא עולה | ||
סדר. | ||
-k | --key=fieldXNXX[,fieldXNXX] | מיון על סמך שדה מפתח שנמצא |
החל מ- fieldXNXX ל fieldXNXX ולא | ||
כל הקו. ראה דיון למטה. | ||
-m | --לְמַזֵג | התייחס לכל טיעון כשם |
של קובץ ממוין מראש. מיזוג מרובים | ||
קבצים לתוצאה ממוינת אחת | ||
מבלי לבצע פעולות נוספות | ||
מִיוּן. | ||
-o | --פלט=פילה | שלח פלט ממוין אל פילה במקום |
מאשר פלט סטנדרטי. | ||
-t | --שדה-מפריד=char | הגדר את מפריד השדות |
אופי. כברירת מחדל שדות הם | ||
מופרדים על ידי רווחים או טאבים. |
למרות שרוב האפשרויות לעיל הן די מובנות מאליהן, חלקן אינן. ראשית, בואו נסתכל על -n אפשרות, המשמשת למיון מספרי. עם אפשרות זו, ניתן למיין ערכים על סמך ערכים מספריים. אנו יכולים להדגים זאת על ידי מיון התוצאות של du פקודה כדי לקבוע את המשתמשים הגדולים ביותר של שטח דיסק. בדרך כלל, ה du הפקודה מפרטת את התוצאות של סיכום לפי סדר שם הנתיב:
[me@linuxbox ~]$ du -s /usr/share/* | רֹאשׁ
252 /usr/share/aclocal
96 /usr/share/acpi-support
8 /usr/share/adduser
196 /usr/share/alacarte
344 /usr/share/alsa
8 /usr/share/alsa-base 12488 /usr/share/anthy
8 /usr/share/apmd
21440 /usr/share/app-install
48 /usr/share/application-registry
[me@linuxbox ~]$ du -s /usr/share/* | רֹאשׁ
252 /usr/share/aclocal
96 /usr/share/acpi-support
8 /usr/share/adduser
196 /usr/share/alacarte
344 /usr/share/alsa
8 /usr/share/alsa-base 12488 /usr/share/anthy
8 /usr/share/apmd
21440 /usr/share/app-install
48 /usr/share/application-registry
בדוגמה זו, אנו מעבירים את התוצאות לתוך ראש להגביל את התוצאות לעשר השורות הראשונות. אנו יכולים לייצר רשימה ממוינת מספרית כדי להציג את עשרת צרכני החלל הגדולים ביותר כך:
[me@linuxbox ~]$ du -s /usr/share/* | sort -nr | רֹאשׁ
509940 /usr/share/locale-langpack
242660 /usr/share/doc
197560 /usr/share/fonts
179144 /usr/share/gnome
146764 /usr/share/myspell
144304 /usr/share/gimp
135880 /usr/share/dict
76508 /usr/share/icons
68072 /usr/share/apps
62844 /usr/share/foomatic
[me@linuxbox ~]$ du -s /usr/share/* | sort -nr | רֹאשׁ
509940 /usr/share/locale-langpack
242660 /usr/share/doc
197560 /usr/share/fonts
179144 /usr/share/gnome
146764 /usr/share/myspell
144304 /usr/share/gimp
135880 /usr/share/dict
76508 /usr/share/icons
68072 /usr/share/apps
62844 /usr/share/foomatic
באמצעות -מספר אפשרויות, אנו מייצרים מיון מספרי הפוך, כאשר הערכים הגדולים ביותר מופיעים ראשונים בתוצאות. מיון זה עובד מכיוון שהערכים המספריים מופיעים בתחילת כל שורה. אבל מה אם נרצה למיין רשימה על סמך ערך כלשהו שנמצא בתוך השורה? לדוגמה, התוצאות של an ll -l:
[me@linuxbox ~]$ ls -l /usr/bin | רֹאשׁ
סה"כ 152948
-rwxr-xr-x | 1 | שורש | שורש | 34824 | 2016-04-04 | 02:42 | [ |
-rwxr-xr-x | 1 | שורש | שורש | 101556 | 2007-11-27 | 06:08 | a2p |
-rwxr-xr-x | 1 | שורש | שורש | 13036 | 2016-02-27 | 08:22 | להתחבר |
-rwxr-xr-x | 1 | שורש | שורש | 10552 | 2007-08-15 | 10:34 | acpi |
-rwxr-xr-x | 1 | שורש | שורש | 3800 | 2016-04-14 | 03:51 | acpi_fakekey |
-rwxr-xr-x | 1 | שורש | שורש | 7536 | 2016-04-19 | 00:19 | acpi_האזן |
-rwxr-xr-x | 1 | שורש | שורש | 3576 | 2016-04-29 | 07:57 | addpart |
-rwxr-xr-x | 1 | שורש | שורש | 20808 | 2016-01-03 | 18:02 | addr2line |
-rwxr-xr-x | 1 | שורש | שורש | 489704 | 2016-10-09 | 17:02 | adept_batch |
מתעלמים, לרגע, מזה ls יכול למיין את התוצאות שלו לפי גודל, נוכל להשתמש sort כדי למיין רשימה זו לפי גודל קובץ, גם כן:
[me@linuxbox ~]$ ls -l /usr/bin | sort -nr -k 5 | רֹאשׁ
-rwxr-xr-x | 1 | שורש | שורש | 8234216 | 2016-04-07 | 17:42 | Inkscape |
-rwxr-xr-x | 1 | שורש | שורש | 8222692 | 2016-04-07 | 17:42 | תצוגת דיו |
-rwxr-xr-x | 1 | שורש | שורש | 3746508 | 2016-03-07 | 23:45 | gimp-2.4 |
-rwxr-xr-x | 1 | שורש | שורש | 3654020 | 2016-08-26 | 16:16 | קוונטים |
-rwxr-xr-x | 1 | שורש | שורש | 2928760 | 2016-09-10 | 14:31 | gdbtui |
-rwxr-xr-x | 1 | שורש | שורש | 2928756 | 2016-09-10 | 14:31 | gdb |
-rwxr-xr-x | 1 | שורש | שורש | 2602236 | 2016-10-10 | 12:56 | נטו |
-rwxr-xr-x | 1 | שורש | שורש | 2304684 | 2016-10-10 | 12:56 | rpcclient |
-rwxr-xr-x | 1 | שורש | שורש | 2241832 | 2016-04-04 | 05:56 | כישרון |
-rwxr-xr-x | 1 | שורש | שורש | 2202476 | 2016-10-10 | 12:56 | smbcacls |
שימושים רבים ב sort כרוך בעיבוד של נתונים טבלאיים, כגון התוצאות של ls הפקודה למעלה. אם נחיל מינוח של מסד נתונים על הטבלה שלמעלה, היינו אומרים שכל שורה היא a שיא ושכל רשומה מורכבת ממספר רב שדות, כגון תכונות הקובץ, ספירת קישורים, שם הקובץ, גודל הקובץ וכן הלאה. sort מסוגל לעבד שדות בודדים. במונחים של מסד נתונים, אנו יכולים לציין אחד או יותר שדות מפתח להשתמש בתור מיון מפתחות. בדוגמה לעיל, אנו מציינים את n ו r אפשרויות לביצוע מיון מספרי הפוך ולציין -ק 5 לעשות sort השתמש בשדה החמישי כמפתח למיון.
השמיים k האפשרות היא מאוד מעניינת ויש לה תכונות רבות, אבל קודם כל אנחנו צריכים לדבר על איך sort מגדיר שדות. בואו ניקח בחשבון קובץ טקסט פשוט מאוד המורכב משורה אחת המכילה את שם המחבר:
וויליאם שוטס
וויליאם שוטס
כברירת מחדל, sort רואה בקו זה שני שדות. השדה הראשון מכיל את התווים:
"וויליאם"
והשדה השני מכיל את התווים:
"זריקות"
כלומר, תווי רווח לבן (רווחים וטאבים) משמשים כמפרידים בין שדות ושהמפרידים נכללים בשדה בעת ביצוע המיון.
מסתכל שוב על שורה משלנו ls פלט, אנו יכולים לראות ששורה מכילה שמונה שדות ושהשדה החמישי הוא גודל הקובץ:
-rwxr-xr-x 1 root root 8234216 2016-04-07 17:42 inkscape
-rwxr-xr-x 1 root root 8234216 2016-04-07 17:42 inkscape
לסדרת הניסויים הבאה שלנו, הבה נשקול את הקובץ הבא המכיל את ההיסטוריה של שלוש הפצות לינוקס פופולריות שפורסמו מ-2006 עד 2008. לכל שורה בקובץ יש שלושה שדות: שם ההפצה, מספר הגרסה ותאריך ההפצה ב-MM/DD /YYYY פורמט:
SUSE | 10.2 | 12/07/2006 |
פדורה | 10 | 11/25/2008 |
SUSE | 11.0 | 06/19/2008 |
אובונטו | 8.04 | 04/24/2008 |
פדורה | 8 | 11/08/2007 |
SUSE | 10.3 | 10/04/2007 |
אובונטו | 6.10 | 10/26/2006 |
פדורה | 7 | 05/31/2007 |
אובונטו | 7.10 | 10/18/2007 |
אובונטו | 7.04 | 04/19/2007 |
SUSE | 10.1 | 05/11/2006 |
פדורה | 6 | 10/24/2006 |
פדורה | 9 | 05/13/2008 |
אובונטו | 6.06 | 06/01/2006 |
אובונטו | 8.10 | 10/30/2008 |
פדורה | 5 | 03/20/2006 |
שימוש בעורך טקסט (אולי מֶרֶץ), נזין נתונים אלה ונשים שם לקובץ שנוצר distros.txt.
לאחר מכן, ננסה למיין את הקובץ ולראות את התוצאות:
[me@linuxbox | ~]$ | מיון distros.txt |
פדורה 10 | 11/25/2008 | |
פדורה 5 | 03/20/2006 | |
פדורה 6 | 10/24/2006 | |
פדורה 7 | 05/31/2007 | |
פדורה 8 | 11/08/2007 | |
פדורה 9 | 05/13/2008 | |
SUSE 10.1 | 05/11/2006 | |
SUSE 10.2 | 12/07/2006 | |
SUSE 10.3 | 10/04/2007 | |
SUSE 11.0 | 06/19/2008 | |
אובונטו 6.06 | 06/01/2006 | |
אובונטו 6.10 | 10/26/2006 | |
אובונטו 7.04 | 04/19/2007 | |
אובונטו 7.10 | 10/18/2007 | |
אובונטו 8.04 | 04/24/2008 | |
אובונטו 8.10 | 10/30/2008 |
ובכן, זה בעיקר עבד. הבעיה מתרחשת במיון מספרי הגרסה של פדורה. מכיוון ש-"1" בא לפני "5" בערכת התווים, גרסה "10" מסתיימת בחלק העליון בעוד שגרסה "9" נופלת למטה.
כדי לתקן בעיה זו נצטרך למיין על מספר מפתחות. אנו רוצים לבצע מיון אלפביתי בשדה הראשון ולאחר מכן מיון מספרי בשדה השני. sort מאפשר
מקרים מרובים של -k אפשרות כך שניתן לציין מספר מפתחות מיון. למעשה, מפתח עשוי לכלול מגוון של שדות. אם לא צוין טווח (כפי שהיה בדוגמאות הקודמות שלנו), sort משתמש במפתח שמתחיל בשדה שצוין ונמשך עד סוף השורה. להלן התחביר למיון מרובה המפתחות שלנו:
[me@linuxbox | ~]$ | sort --key=1,1 --key=2n distros.txt |
פדורה 5 | 03/20/2006 | |
פדורה 6 | 10/24/2006 | |
פדורה 7 | 05/31/2007 | |
פדורה 8 | 11/08/2007 | |
פדורה 9 | 05/13/2008 | |
פדורה 10 | 11/25/2008 | |
SUSE 10.1 | 05/11/2006 | |
SUSE 10.2 | 12/07/2006 | |
SUSE 10.3 | 10/04/2007 | |
SUSE 11.0 | 06/19/2008 | |
אובונטו 6.06 | 06/01/2006 | |
אובונטו 6.10 | 10/26/2006 | |
אובונטו 7.04 | 04/19/2007 | |
אובונטו 7.10 | 10/18/2007 | |
אובונטו 8.04 | 04/24/2008 | |
אובונטו 8.10 | 10/30/2008 |
למרות שהשתמשנו בצורה הארוכה של האפשרות לבהירות, -ק 1,1 -ק 2n יהיה שווה ערך בדיוק. במופע הראשון של אפשרות המפתח, ציינו מגוון שדות לכלול במפתח הראשון. מכיוון שרצינו להגביל את המיון לשדה הראשון בלבד, ציינו 1,1 שפירושו "התחל בשדה XNUMX וסיום בשדה XNUMX". במקרה השני, פירטנו 2n, כלומר שדה 2 הוא מפתח המיון ושהמיון צריך להיות מספרי. ניתן לכלול אות אופציה בסוף מפרט מפתח כדי לציין את סוג המיון שיש לבצע. אותיות אופציות אלו זהות לאפשרויות הגלובליות עבור sort תכנית: b (התעלם מהחסרים המובילים), n (מיון מספרי), r (מיון הפוך), וכן הלאה.
השדה השלישי ברשימה שלנו מכיל תאריך בפורמט לא נוח למיון. במחשבים, תאריכים בדרך כלל מעוצבים לפי YYYY-MM-DD כדי להקל על המיון הכרונולוגי, אבל התאריכים שלנו הם בפורמט האמריקאי של MM/DD/YYYY. כיצד נוכל למיין רשימה זו בסדר כרונולוגי?
למרבה המזל, sort מספק דרך. אפשרות המפתח מאפשרת מפרט של קיזוז בתוך שדות, כדי שנוכל להגדיר מפתחות בתוך שדות:
[me@linuxbox ~]$ sort -k 3.7nbr -k 3.1nbr -k 3.4nbr distros.txt
פדורה 10 11/25/2008
אובונטו 8.10 10/30/2008
[me@linuxbox ~]$ sort -k 3.7nbr -k 3.1nbr -k 3.4nbr distros.txt
פדורה 10 11/25/2008
אובונטו 8.10 10/30/2008
SUSE | 11.0 | 06/19/2008 |
פדורה | 9 | 05/13/2008 |
אובונטו | 8.04 | 04/24/2008 |
פדורה | 8 | 11/08/2007 |
אובונטו | 7.10 | 10/18/2007 |
SUSE | 10.3 | 10/04/2007 |
פדורה | 7 | 05/31/2007 |
אובונטו | 7.04 | 04/19/2007 |
SUSE | 10.2 | 12/07/2006 |
אובונטו | 6.10 | 10/26/2006 |
פדורה | 6 | 10/24/2006 |
אובונטו | 6.06 | 06/01/2006 |
SUSE | 10.1 | 05/11/2006 |
פדורה | 5 | 03/20/2006 |
על ידי ציון -ק 3.7 אנו מדריכים sort להשתמש במפתח מיון שמתחיל בתו השביעי בתוך השדה השלישי, המתאים לתחילת השנה. כמו כן, אנו מציינים -ק 3.1 ו -ק 3.4 לבודד את חלקי החודש והיום של התאריך. אנחנו מוסיפים גם את n ו r אפשרויות להשגת מיון מספרי הפוך. ה b כלולה אפשרות לדכא את הרווחים המובילים (שמספריהם משתנים משורה לשורה, ובכך להשפיע על תוצאת המיון) בשדה התאריך.
קבצים מסוימים אינם משתמשים בטאבים וברווחים כמפרידי שדות; למשל, ה / etc / passwd
קובץ:
[me@linuxbox ~]$ head /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh lp:x:7:7:lp:/var/spool/lpd:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh news:x:9:9:news:/var/spool/news:/bin/sh
[me@linuxbox ~]$ head /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh lp:x:7:7:lp:/var/spool/lpd:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh news:x:9:9:news:/var/spool/news:/bin/sh
השדות בקובץ זה מופרדים בנקודתיים (:), אז איך נמיין את הקובץ הזה באמצעות שדה מפתח? sort מספק את -t אפשרות להגדיר את תו מפריד השדות. כדי למיין את פסח קובץ בשדה השביעי (מעטפת ברירת המחדל של החשבון), נוכל לעשות זאת:
[me@linuxbox ~]$ sort -t ':' -k 7 /etc/passwd | רֹאשׁ
me:x:1001:1001:עצמי,,,:/home/me:/bin/bash
[me@linuxbox ~]$ sort -t ':' -k 7 /etc/passwd | רֹאשׁ
me:x:1001:1001:עצמי,,,:/home/me:/bin/bash
root:x:0:0:root:/root:/bin/bash dhcp:x:101:102::/nonexistent:/bin/false
gdm:x:106:114:Gnome Display Manager:/var/lib/gdm:/bin/false hplip:x:104:7:HPLIP system user,,,:/var/run/hplip:/bin/false klog :x:103:104::/home/klog:/bin/false messagebus:x:108:119::/var/run/dbus:/bin/false polkituser:x:110:122:PolicyKit,,,: /var/run/PolicyKit:/bin/false pulse:x:107:116:PulseAudio daemon,,,:/var/run/pulse:/bin/false
root:x:0:0:root:/root:/bin/bash dhcp:x:101:102::/nonexistent:/bin/false
gdm:x:106:114:Gnome Display Manager:/var/lib/gdm:/bin/false hplip:x:104:7:HPLIP system user,,,:/var/run/hplip:/bin/false klog :x:103:104::/home/klog:/bin/false messagebus:x:108:119::/var/run/dbus:/bin/false polkituser:x:110:122:PolicyKit,,,: /var/run/PolicyKit:/bin/false pulse:x:107:116:PulseAudio daemon,,,:/var/run/pulse:/bin/false
על ידי ציון תו הנקודתיים כמפריד השדות, נוכל למיין בשדה השביעי.