دستهبندی، مرتبسازی و شمارش دادهها از عملیاتهای روزمره در مدیریت سیستم و تحلیل دادهها هستند. ابزارهای sort، uniq و wc سه ابزار قدرتمند و مکمل برای این منظور در محیط خط فرمان هستند که اغلب در ترکیب با یکدیگر و با ابزارهایی مانند grep، cut و awk استفاده میشوند.
sort
دستور sort برای مرتبسازی خطوط یک فایل متنی یا ورودی استاندارد استفاده میشود. این دستور بسیار انعطافپذیر است و میتواند بر اساس کلیدهای مختلف (ستونها)، بهصورت عددی، برعکس، و با حذف موارد تکراری، مرتبسازی کند.
ساختار کلی:
sort [option] [file...]
گزینههای اصلی sort
| گزینه | توضیح | مثال |
|---|---|---|
-n | مرتبسازی عددی (بهجای الفبایی). | sort -n numbers.txt |
-r | مرتبسازی معکوس (نزولی). | sort -r file.txt |
-u | حذف خطوط تکراری (Unique) - مشابه uniq. | sort -u file.txt |
-k | مرتبسازی بر اساس ستون خاص (Key). | sort -k 2 file.txt |
-t | تعیین جداکننده (Delimiter) برای ستونها. | sort -t ':' -k 3 /etc/passwd |
-b | نادیده گرفتن فضای خالی ابتدای خطوط. | sort -b file.txt |
-f | نادیده گرفتن حساسیت به بزرگ/کوچکی (Fold). | sort -f file.txt |
-h | مرتبسازی بر اساس اندازههای قابل خواندن توسط انسان (مانند 1K, 2M, 3G). | sort -h file.txt |
-M | مرتبسازی بر اساس نام ماه (مانند Jan, Feb). | sort -M months.txt |
-R | مرتبسازی تصادفی (Random Shuffle). | sort -R file.txt |
-c | بررسی اینکه آیا فایل مرتب شده است یا خیر. | sort -c file.txt |
-o | نوشتن خروجی در یک فایل (مشابه Redirection). | sort -o sorted.txt file.txt |
مثالهای پایه
-
مرتبسازی الفبایی ساده (پیشفرض):
sort names.txtخروجی: نامها به ترتیب حروف الفبا.
-
مرتبسازی عددی:
echo -e "10\n2\n1\n20" | sort -n # خروجی: # 1 # 2 # 10 # 20
بدون
-n، ترتیب الفبایی میشد:1,10,2,20. -
مرتبسازی معکوس (نزولی):
sort -r numbers.txt
-
مرتبسازی و حذف موارد تکراری:
sort -u names.txt
معادل
sort names.txt | uniq. -
مرتبسازی بر اساس ستون دوم:
echo -e "Ali 30\nZahra 25\nBabak 35" | sort -k 2 # خروجی: # Zahra 25 # Ali 30 # Babak 35
-
مرتبسازی بر اساس ستون سوم
/etc/passwd(UID) بهصورت عددی:sort -t ':' -k 3 -n /etc/passwd
-
مرتبسازی بر اساس اندازهی فایل (با
-hبرای خوانایی بهتر):ls -l | sort -k 5 -h
فایلها را بر اساس اندازه مرتب میکند (1K، 2M، 3G و ...).
-
مرتبسازی بر اساس تاریخ (ماه):
echo -e "Jan\nMar\nFeb" | sort -M # خروجی: # Jan # Feb # Mar
-
مرتبسازی بر اساس چند کلید:
sort -k 1,1 -k 2,2n data.txt
اول بر اساس ستون اول (الفبایی) و سپس بر اساس ستون دوم (عددی).
-
بررسی مرتب بودن یک فایل:
sort -c sorted.txt && echo "File is sorted"
مثالهای پیشرفته
-
مرتبسازی بر اساس ستون دوم بهصورت عددی و سپس ستون اول بهصورت الفبایی:
sort -k 2n -k 1 data.txt
-
مرتبسازی بر اساس یک ستون با شروع از یک کاراکتر خاص:
sort -k 1.3 data.txt
مرتبسازی بر اساس کاراکتر سوم ستون اول.
-
مرتبسازی بر اساس ستون دوم تا انتهای خط:
sort -k 2 data.txt
-
مرتبسازی با حذف فاصلههای اضافی (
-b) و نادیده گرفتن بزرگ/کوچکی (-f):sort -bf file.txt
-
مرتبسازی فایلهای لاگ بر اساس تاریخ (فرض: تاریخ در ابتدای خط):
sort -k 1.1,1.10 log.txt
اگر تاریخ با فرمت
YYYY-MM-DDدر ۱۰ کاراکتر اول باشد.
uniq
دستور uniq (مخفف Unique) برای حذف یا شمارش خطوط تکراری مجاور (Consecutive Duplicate Lines) استفاده میشود. بهدلیل اینکه uniq فقط خطوط تکراری که پشت سر هم آمدهاند را شناسایی میکند، معمولاً خروجی آن قبل از استفاده با sort مرتب میشود تا همهی موارد تکراری در کنار هم قرار گیرند.
ساختار کلی:
uniq [option] [input_file [output_file]]
گزینههای اصلی uniq
| گزینه | توضیح | مثال |
|---|---|---|
-c | شمارش تعداد تکرار هر خط (Count). | uniq -c sorted.txt |
-d | نمایش فقط خطوط تکراری (Duplicate). | uniq -d sorted.txt |
-D | نمایش همهی خطوط تکراری (همهی تکرارها). | uniq -D sorted.txt |
-u | نمایش فقط خطوط منحصربهفرد (Unique) - بدون تکرار. | uniq -u sorted.txt |
-i | نادیده گرفتن حساسیت به بزرگ/کوچکی (Case-Insensitive). | uniq -i sorted.txt |
-f n | نادیده گرفتن n فیلد اول در هر خط. | uniq -f 1 sorted.txt |
-s n | نادیده گرفتن n کاراکتر اول در هر خط. | uniq -s 5 sorted.txt |
-w n | مقایسه فقط n کاراکتر اول هر خط. | uniq -w 10 sorted.txt |
مثالها
-
حذف خطوط تکراری مجاور (پس از
sort):sort names.txt | uniq
-
شمارش تعداد تکرار هر خط:
sort names.txt | uniq -c
خروجی:
3 Ali 1 Babak 2 Zahra
-
نمایش فقط خطوط تکراری:
sort names.txt | uniq -d
خروجی: فقط نامهایی که بیش از یک بار تکرار شدهاند.
-
نمایش فقط خطوط منحصربهفرد (بدون تکرار):
sort names.txt | uniq -u
خروجی: فقط نامهایی که دقیقاً یک بار تکرار شدهاند.
-
نادیده گرفتن فیلد اول در مقایسه (برای CSV):
sort data.csv | uniq -f 1 -c
ستون اول را نادیده میگیرد و بر اساس بقیهی خطوط مقایسه میکند.
-
نادیده گرفتن ۵ کاراکتر اول در مقایسه:
sort data.txt | uniq -s 5 -c
-
مقایسه فقط ۱۰ کاراکتر اول هر خط:
sort data.txt | uniq -w 10 -c
-
پیدا کردن آیپیهای تکراری در لاگ (با فرض اینکه آیپی در ابتدای خط است):
cut -d ' ' -f 1 access.log | sort | uniq -c | sort -nr
این دستور تعداد درخواستهای هر آیپی را بهصورت نزولی نمایش میدهد.
-
پیدا کردن خطاهای تکراری در یک فایل لاگ:
grep "ERROR" log.txt | sort | uniq -c | sort -nr
-
نادیده گرفتن حساسیت به بزرگ/کوچکی:
sort file.txt | uniq -i -c
wc (Word Count)
دستور wc (مخفف Word Count) برای شمارش خطوط، کلمات و کاراکترها در یک فایل یا ورودی استاندارد استفاده میشود.
ساختار کلی:
wc [option] [file...]
گزینههای اصلی wc
| گزینه | توضیح | مثال |
|---|---|---|
-l | شمارش خطوط (Lines). | wc -l file.txt |
-w | شمارش کلمات (Words). | wc -w file.txt |
-c | شمارش بایتها (Bytes). | wc -c file.txt |
-m | شمارش کاراکترها (Characters) - با در نظر گرفتن UTF-8. | wc -m file.txt |
-L | نمایش طول بلندترین خط (Max line length). | wc -L file.txt |
مثالها
-
شمارش خطوط یک فایل:
wc -l file.txt # خروجی: 42 file.txt
(۴۲ خط در فایل)
-
شمارش کلمات یک فایل:
wc -w file.txt
-
شمارش کاراکترها (بایتها):
wc -c file.txt
-
نمایش همهی آمار (خطوط، کلمات، کاراکترها) - پیشفرض:
wc file.txt # خروجی: 42 150 1024 file.txt
-
شمارش خطوط چند فایل:
wc -l file1.txt file2.txt file3.txt # خروجی: 10 file1.txt # 20 file2.txt # 30 file3.txt # 60 total
-
شمارش خطوط خروجی یک دستور (با Pipe):
ls -1 | wc -l
تعداد فایلهای دایرکتوری فعلی را شمارش میکند.
-
شمارش تعداد فرآیندهای در حال اجرا:
ps aux | wc -l
-
پیدا کردن طول بلندترین خط در یک فایل:
wc -L file.txt
-
شمارش تعداد فایلهای
.txtدر دایرکتوری فعلی:find . -name "*.txt" | wc -l
-
شمارش کلمات یک رشته (بدون فایل):
echo "Hello world" | wc -w # خروجی: 2
ترکیب ابزارها: سناریوهای عملی
قدرت واقعی این ابزارها در ترکیب آنها با یکدیگر و با سایر دستورات نمایان میشود. در ادامه، چند سناریوی رایج و ترکیبی را بررسی میکنیم:
۱. پرتکرارترین دستورات در تاریخچه
history | awk '{ print $2 }' | sort | uniq -c | sort -nr | head -10
-
history: لیست دستورات. -
awk '{ print $2 }': استخراج نام دستورات. -
sort: مرتبسازی. -
uniq -c: شمارش تکرارها. -
sort -nr: مرتبسازی بر اساس تعداد (نزولی). -
head -10: ۱۰ مورد اول.
۲. پرتکرارترین کلمات در یک فایل متنی
cat text.txt | tr -cs 'a-zA-Z' '\n' | sort | uniq -c | sort -nr | head -20
-
tr -cs 'a-zA-Z' '\n': تبدیل همهی کاراکترهای غیرحرفی به خط جدید. -
sort: مرتبسازی. -
uniq -c: شمارش تکرارها. -
sort -nr: مرتبسازی نزولی بر اساس تعداد. -
head -20: ۲۰ کلمهی پرتکرار.
۳. پربازدیدترین صفحات وب از لاگهای Apache/Nginx
awk '{ print $7 }' access.log | sort | uniq -c | sort -nr | head -10
-
awk '{ print $7 }': استخراج مسیر URL (فیلد هفتم در فرمت استاندارد لاگ). -
sort: مرتبسازی. -
uniq -c: شمارش درخواستها برای هر مسیر. -
sort -nr: مرتبسازی نزولی. -
head -10: ۱۰ مسیر پربازدید.
۴. مجموع حجم فایلهای با پسوند خاص
find . -name "*.log" -exec ls -l {} \; | awk '{ sum += $5 } END { print "Total size:", sum, "bytes" }'
-
find: پیدا کردن فایلهای.log. -
ls -l: نمایش جزئیات. -
awk: جمعکردن ستون پنجم (اندازه).
۵. تعداد کاربران متصل به سیستم
who | awk '{ print $1 }' | sort | uniq | wc -l
-
who: لیست کاربران متصل. -
awk '{ print $1 }': استخراج نام کاربری. -
sort: مرتبسازی. -
uniq: حذف موارد تکراری (یک کاربر ممکن است چندین نشست داشته باشد). -
wc -l: شمارش تعداد کاربران منحصربهفرد.
۶. پیدا کردن بزرگترین فایلهای دایرکتوری
du -sh * | sort -hr | head -10
-
du -sh *: نمایش حجم هر فایل/دایرکتوری بهصورت قابل خواندن. -
sort -hr: مرتبسازی عددی نزولی بر اساس اندازه. -
head -10: ۱۰ فایل/دایرکتوری بزرگتر.
۷. تعداد خطوط کد در یک پروژه (با حذف کامنتها و خطوط خالی)
find . -name "*.py" -exec cat {} \; | grep -v '^[[:space:]]*#' | grep -v '^[[:space:]]*$' | wc -l
-
find: پیدا کردن فایلهای پایتون. -
cat: نمایش محتوا. -
grep -v '^[[:space:]]*#': حذف خطوط کامنت. -
grep -v '^[[:space:]]*$': حذف خطوط خالی. -
wc -l: شمارش خطوط باقیمانده.
خلاصه و جدول مقایسه
| ابزار | کاربرد اصلی | گزینههای کلیدی |
|---|---|---|
| sort | مرتبسازی خطوط | -n (عددی)، -r (معکوس)، -k (کلید)، -t (جداکننده)، -u (حذف تکراری)، -h (اندازههای انسانی)، -M (ماه) |
| uniq | حذف/شمارش خطوط تکراری مجاور | -c (شمارش)، -d (فقط تکراری)، -u (فقط منحصربهفرد)، -i (نادیده گرفتن بزرگ/کوچکی)، -f (نادیده گرفتن فیلد) |
| wc | شمارش خطوط، کلمات، کاراکترها | -l (خطوط)، -w (کلمات)، -c (بایتها)، -m (کاراکترها)، -L (طول بلندترین خط) |
نکات کلیدی
-
sort | uniqیک ترکیب استاندارد و بسیار رایج است که جایگزینsort -uمیشود و امکان شمارش (-c) را نیز فراهم میکند. -
ترتیب گزینهها در
sort -kمهم است:-
-k 2n: مرتبسازی عددی بر اساس ستون دوم. -
-k 2,2: فقط از ستون دوم استفاده کن (نه تا انتهای خط). -
-k 1.3: از کاراکتر سوم ستون اول شروع کن.
-
-
uniqبدونsortفقط خطوط تکراری مجاور را حذف میکند، بنابراین همیشه قبل ازuniqازsortاستفاده کنید مگر اینکه مطمئن باشید دادهها مرتب هستند. -
استفاده از
wc -lبرای شمارش خطوط خروجی یک دستور یک روش استاندارد برای شمارش تعداد آیتمها است. -
ترکیب
sort | uniq -c | sort -nrیک الگوی پرتکرار برای یافتن موارد پرتکرار است.