فهرست مندرجات

دستور cut ( استخراج بخشی از متن )

از دستور cut جهت استخراج کردن بخشی از متن یک فایل استفاده میشود در این بخش برای توضیح دستور cut و نحوه عملکرد آن یک فایل متنی به نام text.txt را از قبل با محتوای زیر ایجاد کرده ایم

-> $cat text.txt
cat command for file oriented operations.
cp command for copy files or directories.
ls command to list out files and directories with its attributes.

در ادامه بعضی از مهمترین کاربردهای دستور cut را بر روی فایل متنی فوق توضیح خواهیم داد.

کاربردهای دستور cut

انتخاب ستونی از کاراکترها

جهت استخراج کردن یک ستون مشخص از یک فایل از سوئیچ c- به همراه دستور cut استفاده میشود. به عنوان مثال دستور زیر دومین ستون کاراکتری از هر خط فایل text.txt را نمایش میدهد.

-> $cut -c2 text.txt
a
p
s

انتخاب ستونی از کاراکترها با استفاده از رنج

رنج کاراکترها میتواند توسط دستور cut از یک فایل با مشخص کردن ابتدا و انتهای موقعیت جدا کننده با «-» استخراج شود. به عنوان مثال دستور زیر سه کاراکتر هر خط از فایل text.txt را استخارج میکند.

-> $cut -c1-3 text.txt
cat
cp 
ls 

انتخاب ستونی از کاراکترها با استفاده از شروع و پایان بخش

حتی شروع و پایان بخش مورد نظر از متن در یک فایل جهت استخراج شدن میتواند توسط سوئیچ c- به دستور cut ارسال شود. به عنوان مثال با استفاده از دستور زیر فقط شروع بخش را قبل از «-» مشخص میکنیم در این مثال از سومین کاراکتر تا انتهای هر خط فایل text.txt استخراج میشود

توجه کنید که سومین کاراکتر خط اول فایل کاراکتر t و سومین کاراکتر خط دوم و سوم آن blank است.

ٰ-> $cut -c3- text.txt
t command for file oriented operations.
 command for copy files or directories.
 command to list out files and directories with its attributes.

یا به عنوان مثالی دیگر با استفاده از دستور زیر ۸ کاراکتر از ابتدای هر خط text.txt را استخراج میکنیم.

-> $cut -c-8 text.txt
cat comm
cp comma
ls comma

انتخاب یک فیلد خاص از یک فایل

به جای مشخص کردن شماره کاراکترها در دستور cut اگر شما میخواهید یک فیلد کامل را استخراج کنید میتوانید از ترکیب دو سوئیچ f- و d- استفاده نمایید سوئیچ f- به معنی field میباشد و مشخص میکند که شما قصد دارید یک فیلد خاص را استخراج کنید سوئیچ d- نیز به معنی delimiter ( جدا کننده) میباشد و فیلد جدا کننده ای که در فایل ورودی استفاده شده را مشخص میکند.به عنوان مثال با استفاده از دستور زیر فقط اولین فیلد هر خط از فایل etc/passwd/ که با استفاده از جدا کننده : یا colon است استخراج میکنیم. توجه کنید که اولین فیلد هر خط از فایل etc/passwd/ مشخص کننده username است.

-> $cut -d':' -f1 /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown

انتخاب چندین فیلد از یک فایل

شما میتوانید همچنین بیش از یک فیلد را از یک فایل یا stdout استخراج کنید. به عنوان مثال با استفاده از دستور زیر فیلد اول و ششم از فایل etc/passwd/ که به ترتیب مربوط به username و home directory کاربران است را استخراج میکنیم.

-> $grep "/bin/bash" /etc/passwd|cut -d':' -f1,6
root:/root
phoenix:/home/phoenix

همچنین جهت نمایش یک رنج از فیلدهای مشخص میتوانیم فیلد شروع و فیلد پایانی را با استفاده از سوئیچ f- به دستور cut ارسال کنیم. به عنوان مثال با استفاده از دستور زیر فیلدهای 1 تا 4 و همینطور فیلدهای 6 و 7 از فایل etc/passwd/ را توسط دستور cut استخراج میکنیم.

-> $grep "/bin/bash" /etc/passwd|cut -d':' -f1-4,6,7
root:x:0:0:/root:/bin/bash
phoenix:x:1000:1000:/home/phoenix:/bin/bash

انتخاب فیلدها فقط زمانیکه یک خط شامل جدا کننده باشد

در فایل etc/passwd/ اگر شما از delimiter یا جدا کننده دیگری به جز : یا colon استفاده نمایید دستور cut کل خط را نمایش خواهد داد. به عنوان مثال در دستور زیر به جای delimiter از علامت pip یا | استفاده کرده ایم و دستور cut نیز به سادگی کل خط را نمایش میدهد. حتی اگر هیچ خطی را با جداکننده | پیدا نکند.

-> $grep "/bin/bash" /etc/passwd|cut -d'|' -f1
root:x:0:0:root:/root:/bin/bash
phoenix:x:1000:1000:phoenix:/home/phoenix:/bin/bash

اما با استفاده از سوئیچ s- دستور cut میتوانیم تنها خطوطی را که شامل جدا کننده خاصی هستند را فیلتر کرده و نمایش دهیم.به عنوان مثال دستور زیر هیچ خروجی ای را نمایش نمیدهد. چرا که دستور cut هیچ خطی را که دارای جدا کننده | باشد را نمیتواند در فایل etc/passwd/ پیدا کند.

-> $grep "/bin/bash" /etc/passwd|cut -d'|' -s -f1

انتخاب همه فیلدها به جز فیلدهای خاص

جهت مشخص کردن فیلدهای خاص از گزینه complement– به همراه دستور cut استفاده میشود. به عنوان مثال با استفاده از دستور زیر همه فیلدهای فایل etc/passwd/ به جز فیلد 7 آن نمایش داده میشود.

-> $grep "/bin/bash" /etc/passwd|cut -d':' --complement -s -f7
root:x:0:0:root:/root
phoenix:x:1000:1000:phoenix:/home/phoenix

تغییر خروجی جداکننده برای نمایش

بصورت پیش فرض خروجی جداکننده با ورودی جداکننده که ما با استفاده از سوئیچ d- در دستور cut مشخص میکنیم یکسان است جهت تغییر خروجی جدا کننده برای نمایش از گزینه output-delimiter– استفاده میشود در این مثال ورودی جدا کننده علامت : یا colon اما خروجی جداکننده علامت # یا hash میباشد.

-> $grep "/bin/bash" /etc/passwd|cut -d':' -s -f1,6,7 --output-delimiter='#'
root#/root#/bin/bash
phoenix#/home/phoenix#/bin/bash

ترکیب دستور cut با دیگر دستورات

قدرت دستور cut را میتوانید زمانی این دستور را با خروجی استاندارد دستورات دیگر ترکیب میکنید مشاهده نمایید مثال زیر نشان میدهد که شما چگونه میتوانید فقط اطلاعات مفید را از خروجی دستور ps استخراج کنید. همچنین در این مثال نشان داده ایم که چگونه میتواند خروجی دستور ps را با استفاده از دستورات grep و sed قبل از خروجی نهایی که توسط cut تولید میشود فیلتر نمود.

-> $ps axu|grep python|sed 's/\s\+//g'|cut -d' ' -f2,11-
root6930.00.23462368776?Ssl08:300:01/usr/bin/python3-Es/usr/sbin/firewalld--nofork--nopid
phoenix13070.00.286167210784?Sl08:300:04python3/usr/bin/dnfdragora-updater
phoenix13160.00.01326520?S08:300:00/usr/bin/python3/usr/bin/blueberry-tray
phoenix13550.00.475246816332?Sl08:300:00/usr/bin/python2/usr/lib/blueberry/blueberry-tray.py
phoenix16270.00.01460288?S08:300:00python2/usr/lib/blueberry/safechild/usr/sbin/rfkillevent
root16360.00.15890885036?Ssl08:300:04/usr/bin/python3/usr/share/dnfdaemon/dnfdaemon-system
phoenix293170.00.01197201016pts/2S+20:040:00grep--color=autopython