sort
• sort يقوم البرنامج بفرز محتويات الإدخال القياسي ، أو ملفًا واحدًا أو أكثر محددًا في سطر الأوامر ، ويرسل النتائج إلى الإخراج القياسي. باستخدام نفس التقنية التي استخدمناها قط، يمكننا إثبات معالجة الإدخال القياسي مباشرةً من لوحة المفاتيح:
[me @ linuxbox ~] $ فرز> foo.txt
cba
[me @ linuxbox ~] $ القط foo.txt
اي بي سي
[me @ linuxbox ~] $ فرز> foo.txt
cba
[me @ linuxbox ~] $ القط foo.txt
اي بي سي
بعد إدخال الأمر ، نكتب الأحرف "ج" و "ب" و "أ" ، متبوعة مرة أخرى السيطرة- د للإشارة إلى نهاية الملف. ثم نعرض الملف الناتج ونرى أن الأسطر تظهر الآن بترتيب مرتب.
منذ sort يمكن قبول ملفات متعددة على سطر الأوامر كوسيطات ، فمن الممكن أن دمج ملفات متعددة في كل واحد مرتبة. على سبيل المثال ، إذا كان لدينا ثلاثة ملفات نصية وأردنا دمجها في ملف واحد مرتبة ، فيمكننا القيام بشيء مثل هذا:
قم بفرز file1.txt file2.txt file3.txt> final_sorted_list.txt
قم بفرز file1.txt file2.txt file3.txt> final_sorted_list.txt
نوع لديه العديد من الخيارات المثيرة للاهتمام. وهنا لائحة جزئية:
جدول 20-1: خيارات الفرز الشائعة
خيار | خيار طويل | الوصف |
-b | - إهمال الفراغات الرائدة | بشكل افتراضي ، يتم إجراء الفرز على |
السطر بأكمله ، بدءًا من | ||
أول حرف في السطر. هذه | ||
يؤدي الخيار إلى تجاهل الفرز | ||
المسافات الرائدة في الخطوط و | ||
يحسب الفرز على أساس الأول | ||
حرف بدون مسافة بيضاء على | ||
الخط. | ||
-f | - أقل من حالة | يجعل الفرز غير حساس لحالة الأحرف. |
-n | - فرز رقمي | يقوم بالفرز بناءً على التقييم الرقمي لسلسلة. يتيح استخدام هذا الخيار إجراء الفرز على القيم الرقمية بدلاً من القيم الأبجدية. |
-r | --يعكس | فرز بترتيب عكسي. النتائج في |
تنازليًا وليس تصاعديًا | ||
النظام. | ||
-k | - مفتاح =field1[,field2] | فرز على أساس حقل المفتاح الموجود |
تبدأ من field1 إلى field2 بدلا من | ||
الخط بأكمله. انظر المناقشة أدناه. | ||
-m | --دمج | تعامل مع كل حجة على أنها الاسم |
من ملف تم فرزها مسبقًا. دمج عدة | ||
الملفات في نتيجة مرتبة واحدة | ||
دون القيام بأي عمل إضافي | ||
فرز. | ||
-o | - الخرج =ملف | إرسال الإخراج الفرز إلى ملف بدلا |
من الناتج القياسي. | ||
-t | - فاصل الحقول =دبابة | حدد فاصل المجال |
اختلاف الشخصيات. بشكل افتراضي الحقول | ||
مفصولة بمسافات أو علامات تبويب. |
على الرغم من أن معظم الخيارات المذكورة أعلاه تشرح نفسها بنفسها ، إلا أن بعضها ليس كذلك. أولاً ، دعنا نلقي نظرة على ملف -n الخيار المستخدم في الفرز الرقمي. باستخدام هذا الخيار ، من الممكن فرز القيم بناءً على القيم الرقمية. يمكننا إثبات ذلك من خلال فرز نتائج du الأمر لتحديد أكبر مستخدمي مساحة القرص. عادة ، du يسرد الأمر نتائج الملخص بترتيب اسم المسار:
[me @ linuxbox ~] $ du -s / usr / share / * | رئيس
252 / البيرة / حصة / محلي
96 / usr / share / acpi-support
8 / البيرة / المشاركة / الإضافة
196 / البيرة / حصة / الكارت
344 / البيرة / حصة / السا
8 / usr / share / alsa-base 12488 / usr / share / anthy
8 / البيرة / حصة / apmd
21440 / usr / share / app-install
48 / البيرة / حصة / تطبيق التسجيل
[me @ linuxbox ~] $ du -s / usr / share / * | رئيس
252 / البيرة / حصة / محلي
96 / usr / share / acpi-support
8 / البيرة / المشاركة / الإضافة
196 / البيرة / حصة / الكارت
344 / البيرة / حصة / السا
8 / usr / share / alsa-base 12488 / usr / share / anthy
8 / البيرة / حصة / apmd
21440 / usr / share / app-install
48 / البيرة / حصة / تطبيق التسجيل
في هذا المثال ، نرسل النتائج إلى رئيس لقصر النتائج على الأسطر العشرة الأولى. يمكننا إنتاج قائمة مرتبة عدديًا لإظهار أكبر عشرة مستهلكين للمساحة بهذه الطريقة:
[me @ linuxbox ~] $ du -s / usr / share / * | فرز -nr | رئيس
509940 / usr / share / locale-langpack
242660 / usr / share / doc
197560 / البيرة / المشاركة / الخطوط
179144 / البيرة / حصة / جنوم
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 / * | فرز -nr | رئيس
509940 / usr / share / locale-langpack
242660 / usr / share / doc
197560 / البيرة / المشاركة / الخطوط
179144 / البيرة / حصة / جنوم
146764 / usr / share / myspell
144304 / usr / share / gimp
135880 / usr / share / dict
76508 / usr / share / icons
68072 / usr / share / apps
62844 / usr / share / foomatic
باستخدام -رقم الخيارات ، ننتج فرزًا عدديًا عكسيًا ، مع ظهور القيم الأكبر أولاً في النتائج. يعمل هذا الفرز لأن القيم العددية تحدث في بداية كل سطر. ولكن ماذا لو أردنا فرز قائمة بناءً على بعض القيم الموجودة داخل السطر؟ على سبيل المثال ، نتائج ملف لس -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 | a2 ص |
-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_listen |
-rwxr-xr-x | 1 | جذر | جذر | 3576 | 2016-04-29 | 07:57 | com.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 | فرز -nr -k 5 | رئيس
-rwxr-xr-x | 1 | جذر | جذر | 8234216 | 2016-04-07 | 17:42 | إنكسكيب |
-rwxr-xr-x | 1 | جذر | جذر | 8222692 | 2016-04-07 | 17:42 | إنكفيو |
-rwxr-xr-x | 1 | جذر | جذر | 3746508 | 2016-03-07 | 23:45 | الأعرج 2.4 |
-rwxr-xr-x | 1 | جذر | جذر | 3654020 | 2016-08-26 | 16:16 | الكميات |
-rwxr-xr-x | 1 | جذر | جذر | 2928760 | 2016-09-10 | 14:31 | com.gdbtui |
-rwxr-xr-x | 1 | جذر | جذر | 2928756 | 2016-09-10 | 14:31 | جدب |
-rwxr-xr-x | 1 | جذر | جذر | 2602236 | 2016-10-10 | 12:56 | صاف |
-rwxr-xr-x | 1 | جذر | جذر | 2304684 | 2016-10-10 | 12:56 | com.rpcclient |
-rwxr-xr-x | 1 | جذر | جذر | 2241832 | 2016-04-04 | 05:56 | أهلية |
-rwxr-xr-x | 1 | جذر | جذر | 2202476 | 2016-10-10 | 12:56 | com.smbcacls |
العديد من الاستخدامات sort تنطوي على معالجة بنك، مثل نتائج ls الأمر أعلاه. إذا طبقنا مصطلحات قاعدة البيانات على الجدول أعلاه ، فسنقول أن كل صف هو ملف سجل وأن كل سجل يتكون من عدة الحقول، مثل ملف الجزية ، وعدد الروابط ، واسم الملف ، وحجم الملف وما إلى ذلك. sort قادر على معالجة الحقول الفردية. من حيث قواعد البيانات ، نحن قادرون على تحديد واحد أو أكثر المجالات الرئيسية لاستخدامها فرز المفاتيح. في المثال أعلاه ، نحدد n و r خيارات لإجراء فرز رقمي عكسي وتحديد -ك 5 ليصنع sort استخدم الحقل الخامس كمفتاح للفرز.
• k الخيار مثير جدًا للاهتمام وله العديد من الميزات ، لكن أولاً نحتاج إلى التحدث عن كيفية القيام بذلك sort يحدد المجالات. لنفكر في ملف نصي بسيط للغاية يتكون من سطر واحد يحتوي على اسم المؤلف:
وليام شوتس
وليام شوتس
افتراضيا، sort يرى أن هذا السطر يحتوي على حقلين. يحتوي الحقل الأول على الأحرف:
"ويليام"
والحقل الثاني يحتوي على الأحرف:
"لقطات"
مما يعني أنه يتم استخدام أحرف المسافات البيضاء (المسافات وعلامات الجدولة) كمحددات بين الحقول وأن المحددات يتم تضمينها في الحقل عند إجراء الفرز.
النظر مرة أخرى إلى خط من ls الإخراج ، يمكننا أن نرى أن السطر يحتوي على ثمانية حقول وأن الحقل الخامس هو حجم الملف:
-rwxr-xr-x 1 جذر جذر 8234216 2016-04-07 17:42 إنكسكيب
-rwxr-xr-x 1 جذر جذر 8234216 2016-04-07 17:42 إنكسكيب
بالنسبة لسلسلة تجاربنا التالية ، دعنا ننظر في الملف التالي الذي يحتوي على محفوظات توزيعات Linux الثلاثة الشائعة التي تم إصدارها من 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 |
استخدام محرر نصوص (ربما همة) ، سنقوم بإدخال هذه البيانات وتسمية الملف الناتج dis-tros.txt.
بعد ذلك ، سنحاول فرز الملف ومراقبة النتائج:
[لي @ لينوكس بوكس | ~] $ | فرز 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 | |
سوس 10.1 | 05/11/2006 | |
سوس 10.2 | 12/07/2006 | |
سوس 10.3 | 10/04/2007 | |
سوس 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 |
حسنًا ، لقد نجحت في الغالب. تحدث المشكلة في فرز أرقام إصدارات Fedora. نظرًا لأن الرقم "1" يأتي قبل الرقم "5" في مجموعة الأحرف ، ينتهي الأمر بالإصدار "10" في الأعلى بينما يقع الإصدار "9" في الأسفل.
لإصلاح هذه المشكلة ، سيتعين علينا الفرز على مفاتيح متعددة. نريد إجراء فرز أبجدي في الحقل الأول ثم فرز رقمي في الحقل الثاني. sort يسمح
حالات متعددة من -k الخيار بحيث يمكن تحديد مفاتيح الفرز المتعددة. في الواقع ، قد يشتمل المفتاح على مجموعة من الحقول. إذا لم يتم تحديد نطاق (كما كان الحال مع الأمثلة السابقة) ، sort يستخدم مفتاحًا يبدأ بالحقل المحدد ويمتد حتى نهاية السطر. فيما يلي بناء الجملة لفرزنا متعدد المفاتيح:
[لي @ لينوكس بوكس | ~] $ | فرز - key = 1,1،2 --key = XNUMXn 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 | |
سوس 10.1 | 05/11/2006 | |
سوس 10.2 | 12/07/2006 | |
سوس 10.3 | 10/04/2007 | |
سوس 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 |
على الرغم من أننا استخدمنا الشكل الطويل لخيار الوضوح ، -k 1,1،2 -k XNUMXn سيكون مكافئًا تمامًا. في المثال الأول لخيار المفتاح ، حددنا نطاقًا من الحقول لتضمينها في المفتاح الأول. نظرًا لأننا أردنا قصر الفرز على الحقل الأول فقط ، فقد حددنا ذلك 1,1 وهو ما يعني "ابدأ من الحقل الأول وانتهى عند الحقل الأول." في الحالة الثانية ، حددنا 2n، مما يعني أن الحقل 2 هو مفتاح الفرز وأن الفرز يجب أن يكون رقميًا. قد يتم تضمين حرف خيار في نهاية محدد المفتاح للإشارة إلى نوع الفرز الذي سيتم إجراؤه. أحرف الخيار هذه هي نفس الخيارات العامة لملف sort برنامج: b (تجاهل الفراغات البادئة) ، n (فرز رقمي) ، r (فرز عكسي) ، وما إلى ذلك.
يحتوي الحقل الثالث في قائمتنا على تاريخ بتنسيق غير ملائم للفرز. في الحواسيب ، عادة ما يتم تنسيق التواريخ بالترتيب YYYY-MM-DD لتسهيل الفرز الزمني ، لكن تاريخنا بالتنسيق الأمريكي MM / DD / YYYY. كيف يمكننا فرز هذه القائمة بالترتيب الزمني؟
لحسن الحظ، sort يوفر وسيلة. يسمح الخيار الرئيسي بمواصفات إزاحة داخل الحقول ، حتى نتمكن من تحديد المفاتيح داخل الحقول:
[me @ linuxbox ~] $ فرز -k 3.7nbr -k 3.1nbr -k 3.4nbr distros.txt
فيدورا 10 11/25/2008
نظام التشغيل Ubuntu 8.10 10/30/2008
[me @ linuxbox ~] $ فرز -k 3.7nbr -k 3.1nbr -k 3.4nbr distros.txt
فيدورا 10 11/25/2008
نظام التشغيل Ubuntu 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 يتم تضمين الخيار لمنع المسافات البادئة (التي تختلف أرقامها من سطر إلى آخر ، وبالتالي تؤثر على نتيجة الفرز) في حقل التاريخ.
لا تستخدم بعض الملفات علامات الجدولة والمسافات كمحددات للحقول ؛ على سبيل المثال ، / الخ / باسود
ملف:
[me @ linuxbox ~] $ رئيس / الخ / 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 ~] $ رئيس / الخ / 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 | رئيس
أنا: x: 1001: 1001: نفسي ،،،: / home / me: / bin / bash
[me @ linuxbox ~] $ Sort -t ':' -k 7 / etc / passwd | رئيس
أنا: x: 1001: 1001: نفسي ،،،: / home / me: / bin / bash
الجذر: x: 0: 0: root: / root: / bin / bash dhcp: x: 101: 102 :: / غير موجود: / bin / false
gdm: x: 106: 114: Gnome Display Manager: / var / lib / gdm: / bin / false hplip: x: 104: 7: مستخدم نظام HPLIP ،،،: / 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
الجذر: x: 0: 0: root: / root: / bin / bash dhcp: x: 101: 102 :: / غير موجود: / bin / false
gdm: x: 106: 114: Gnome Display Manager: / var / lib / gdm: / bin / false hplip: x: 104: 7: مستخدم نظام HPLIP ،،،: / 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
من خلال تحديد حرف النقطتين كفاصل المجال ، يمكننا الفرز في الحقل السابع.