هر ادمین لینوکس، روزانه با فایل های متنی زیادی سر و کار دارد. دانستن نحوه نمایش بخش های خاص، نحوه جابه جایی کلمات و همچنین فیلتر کردن محتوا از این فایل ها، همه و همه مهارت هایی هستند که شما باید بدون نیاز به سرچ گوگل تمام آنها را بدانید. در این مقاله ما دستور sed را مرور خواهیم کرد که یک ادیتور شناخته شده میباشد و 15 ترفند برای استفاده به منظور دسترسی به هدف هایی که در بالا اشاره شد را با شما به اشتراک میگذاریم.
1 - نمایش خطوطی از یک داکیومنت
ابزاری مانند head و tail به ما امکان نمایش بالا و پایین یک فایل را میدهند اما اگر ما بخواهیم بخشی در وسط یک فایل را ببینیم باید از چه استفاده کنیم ؟ دستور زیر برای ما خط های 5 تا 10 از فایل myfile.txt برا میگرداند.
همچنین توصیه میشود مطالعه کنید:
مدیریت موثر فایل ها در linux با استفاده از دستورات head / tail و cat
دستور wc در لینوکس برای شمارش خطوط و کلمات یک فایل متنی
نحوه شمارش یک کلمه خاص در فایل متنی
دستور sed برای مدیریت فایل های متنی
نحوه اضافه کردن متن به آخر یک فایل در لینوکس
دستور awk جهت فیلتر کردن متن یا رشته های متنی
2 - نمایش کل فایل به غیر از یک رنج داده شده
از طرف دیگر این امکان وجود دارد که کل یک فایل را به غیر از یک تعداد خط نمایش دهید. برای اینکه تمامی خطوط فایل myfile.txt به غیر از خط های 20 تا 35 نمایش داده شوند دستور زیر را اجرا میکنیم :
3 - نمایش خطوط غیر متوالی (پشت سر هم نیستند)
ممکن است شما خطوط غیر متوالی را نیاز داشته باشید. با دستور زیر میتوانید خط های 5 تا 7 و 10 تا 13 را از فایل myfile.txt نمایش دهید.
همانطور که میبینید آپشن -e به شما این امکان را میدهد تا یک بخش داده شده (در اینجا منظور نمایش خط ها میباشد) برای هر رنج را اجرا کنید.
4 - جایگزین کردن کلمات یا کاراکتر ها (جایگزینی ساده)
نکته: لطفا توجه کنید که آپشن -i موجب اعمال تغییرات به هنگام ویرایش میشود و چیزی در screen نمایش داده نمیشود و تنها درون فایل ذخیره میشود. در صورتی که میخواهید فقط خروجی دستور را ببینید از آپشن -i استفاده نکنید.
برای جایگزین کردن هر مورد از کلمه version با کلمه story در فایل myfile.txt دستور زیر را اجرا کنید :
بعلاوه ممکن است شما به منظور صرف نظر کردن از حروف بزرگ و کوچک به جای آپشن g در دستور بالا از gi استفاده کنید.
برای جابه جا کردن چندین space خالی با تنها یک space ما از دستور ip route show و یک pipline به دستور sed همانند زیر استفاده میکنیم.
خروجی دستور ip route show را با دستور بالا مقایسه کنید.

5 - جایگزینی کلمات یا کاراکترها در یک رنج (مثلا از خط 30 تا 40)
اگر شما بخواهید کلماتی را که تنها درون یک محدوده خاصی از خطوط هستند (به طور مثال از خط 30 تا 40) جایگزین کنید، از دستور زیر استفاده کنید.
البته شما میتوانید یک خط مجزا را از طریق عدد آن خط به جای مشخص کردن یک رنج استفاده کنید.
6 - استفاده از regular expression ها (جایگزینی پیشرفته) - شماره یک
بعضی اوقات درون فایل های config خطوط کامنت شده زیادی دارند. ممکن است که برای شما مفید باشد که تنها خطوط اصلی فایل کانفیگ بدون خطوط کامنت شده را بخواهید در یک نگاه ببینید.
برای حذف خط های خالی یا خط هایی که با علامت شارپ "#" شروع میشوند از فایل کانفیگ apache دستور زیر را اجرا کنید.
علامت caret یا "^" مشخص کننده ابتدای یک خط است یعنی مثلا (^#) یعنی هر خطی که با # شروع شود. و علامت (^$) نمایش دهنده خطوطی هست که خالی هستند.
در این اینجا فایل کانفیگ apache خط هایی با #’s دارد، که در ابتدای خطوط نیستند، بنابراین برای حذف آنها از *# استفاده میکنیم.
7 - استفاده از regular expression (جایگزینی پیشرفته) - شماره دو
برای جا به جا کردن یک کلمه که با حروف بزرگ یا کوچک شروع میشود با کلمه دیگر نیز میتوان از دستور sed استفاده کرد. برای مثال کلمه zip یا Zip را با rar در فایل myfile.txt جابجا می کنیم.
توصیه میشود این مقاله را هم مطالعه کنید :
نحوه استفاده از AWK و عبارات خاص برای فیلتر کردن متن یا رشته های متنی در فایل ها
8 - نمایش خط هایی که در آنها یک patern خاص موجود است
استفاده دیگر از دستور sed برای نمایش خطوطی از یک فایل است که با یک regular expression (عبارت خاص) داده شده match باشد. برای مثال ممکن است بخواهید فعالیت های login و logout کردن به سرور در 2 july را مشاهده کنید. (لاگ موجود در فایل var/log/secure در سرور centos 7)
در این مورد الگویی که برای جستجو کردن استفاده میکنیم jul 2 میباشد که در ابتدای هر خط موجود است.

9 - وارد کردن فاصله (space) در فایل ها
با دستور sed همچنین میتوانیم خط های خالی و یا space در یک فایل ایجاد کنیم. برای وارد کردن یک خط خالی ما بین تمامی خطوط (یک خط در میان یک خط خالی بندازیم) از دستور زیر به همراه نام فایل استفاده میکنیم.
برای وارد کردن 2 خط در بین تمامی خطوط همانند زیر عمل میکنیم.
اگر شما میخواهید که خط های خالی بیشتری را بین خطوط اضافه کنید، از یک G بزرگ که به واسطه یک simicolon جدا شده استفاده کنید. مثال زیر دستورات بالا را درباره فایلی به نام LICENCE به شما نمایش خواهد داد.

اگر شما بخواهید یک فایل کانفیگ خیلی بزرگ را بررسی کنید این ترفند به شما بسیار کمک خواهد کرد. وارد کردن یک خط خالی مابین خطوط و pip کردن خروجی به دستور less به شما در خواندن بهتر خروجی کمک بسزایی خواهد کرد.
10 - شبیه سازی دستور dos2unix با استفاده از ادیتور sed
برنامه dos2unix فایل های plain text را از فرمت windows/mac به unix/unix تبدیل میکند. همچنین کاراکترهای new line مخفی را که توسط بعضی از ویرایشگرهای متنی و در آن پلتفرم خاص اضافه شده اند را حذف میکند. اگر روی سیستم تان نصب نبود شما میتوانید برای آن کاربرد و به جای نصب dos2unix از دستور sed استفاده کنید.
در تصویر سمت چپ شما میتوانید کاراکتر های DOS newline را (^M) مشاهده کنید که در تصویر بعد حذف شده اند.

لطفا توجه کنید که آپشن -i موجب اعمال تغییرات به هنگام ویرایش میشود و چیزی در screen نمایش داده نمیشود. و تنها درون فایل ذخیره میشود.
دقت کنید که شما میتوانید کاراکترهای dos newline را به هنگام ویرایش کردن یک فایل با ادیتور vi با استفاده از ctrl+V و ctrl+M وارد کنید.
همچنین توصیه میشود مطالعه کنید.
نصب و راه اندازی vi/vim در لینوکس
11 - ویرایش درجا و گرفتن backup از فایل اصلی
در قسمت قبلی ما از دستور sed برای تغییرات در محتوای فایل استفاده کردیم و تغییری در فایل اصلی ذخیره نکردیم. گاهی اوقات ذخیره یک backup از فایل اصلی در همان لحظه ایده ی بسیار خوبی است. برای این هدف از آپشن -i و یک پسوند (درون single quotes) برای تغییر نام فایل اصلی استفاده میکنیم.
در مثال زیر ما در فایل myfile.txt همه کلمات this یا This (بدون در نظر گرفتن حروف بزرگ یا کوچک) را با کلمه that جایگزین خواهیم کرد و همچنین فایل اصلی را با نام myfile.txt.orig ذخیره میکنیم و در نهایت از دستور diff برای بررسی تفاوتهای بین دو فایل استفاده می کنیم.

12 - فرض کنید شما فایلی شامل نام های کامل (با فرمت نام و نام خانوادگی) دارید
ممکن است شما برای بررسی بهتر فایل بخواهید که جای این فیلدها را با هم جابجا کنید. یعنی اول نام خانوادگی و بعد نام قرار گیرند.
با دستور sed به راحتی می توان این کار را انجام داد:

در تصویر بالا پرانتز اول نشان دهنده کاراکتر 1 و پرانتز دوم نشان دهنده کاراکتر 2 می باشد.
همچنین در دستور بالا :
1: نشان دهنده شروع هر خط تا علامت کاما (،) می باشد.
2: نشان دهنده هر چیزی بعد از کاما تا پایان خط می باشد.
خروجی مطلوب که در فرمت نمایش داده شده به این صورت است :
که شما میتوانید آنرا به دلخواه خود تغییر دهید.
13- جایگزینی کلمات تنها در صورت یافتن یک الگوی خاص
گاهی اوقات شما نمیخواهید که تمام موارد موجود از یک کلمه را با کلمه ای دیگر جایگزین کنید و میخواهید تنها زمانی جایگزین شود که در آن خط یک کلمه ی خاص دیگر هم باشد.
برای مثال ممکن است بخواهید کلمه start را با stop تنها درخطی که کلمه ی service در آن است جایگزین کنید. در این سناریو ما فایل زیر را داریم:
از آنجایی که در خط اول کلمه ی service وجود ندارد کلمه start با stop جایگزین نمیشود و تنها در خط دوم جایگزینی انجام میشود:

14 - اجرای همزمان دو مورد جایگزینی یا بیشتر
شما میتوانید چند مورد جایگزینی را تنها با یک خط کامند sed انجام دهید. در اینجا کلمات taht و line را با کلمات this و verse به ترتیب جایگزین میکنیم.
برای این منظور از دستور زیر استفاده میکنیم:
همانند تصویر زیر :

15 - ترکیب دستور sed و دستورات دیگر
البته که میتوانیم دستور sed را با دیگر دستورات ترکیب کنیم و کامندهای قدرتمندی ایجاد کنیم. برای مثال از مثال مورد 4 استفاده میکنیم و ip address را از خروجی دستور ip route جدا می کنیم.
ما ابتدا با نمایش خطی که کلمه src در آن است شروع می کنیم. سپس چندین space را به یک space تبدیل میکنیم. در نهایت فیلد نهم (یک space را بعنوان جدا کننده ی (separator) فیلدها در نظر میگیریم) که مکان ip address هست را جدا میکنیم.
تصویر زیر مراحل دستور بالا را نمایش میدهد:

خلاصه :
در این پست 15 ترفند از دستور sed را برای مدیریت بهتر کارهای روزانه سیستم مورد بحث قرار دادیم. باعث خوشحالیست اگر شما نیز ترفندی در استفاده از این دستور میدانید با ما به اشتراک بگذارید.
موفق باشید.
1 - نمایش خطوطی از یک داکیومنت
ابزاری مانند head و tail به ما امکان نمایش بالا و پایین یک فایل را میدهند اما اگر ما بخواهیم بخشی در وسط یک فایل را ببینیم باید از چه استفاده کنیم ؟ دستور زیر برای ما خط های 5 تا 10 از فایل myfile.txt برا میگرداند.
کد HTML:
# sed -n '5,10p' myfile.txt
مدیریت موثر فایل ها در linux با استفاده از دستورات head / tail و cat
دستور wc در لینوکس برای شمارش خطوط و کلمات یک فایل متنی
نحوه شمارش یک کلمه خاص در فایل متنی
دستور sed برای مدیریت فایل های متنی
نحوه اضافه کردن متن به آخر یک فایل در لینوکس
دستور awk جهت فیلتر کردن متن یا رشته های متنی
2 - نمایش کل فایل به غیر از یک رنج داده شده
از طرف دیگر این امکان وجود دارد که کل یک فایل را به غیر از یک تعداد خط نمایش دهید. برای اینکه تمامی خطوط فایل myfile.txt به غیر از خط های 20 تا 35 نمایش داده شوند دستور زیر را اجرا میکنیم :
کد HTML:
# sed '20,35d' myfile.txt
3 - نمایش خطوط غیر متوالی (پشت سر هم نیستند)
ممکن است شما خطوط غیر متوالی را نیاز داشته باشید. با دستور زیر میتوانید خط های 5 تا 7 و 10 تا 13 را از فایل myfile.txt نمایش دهید.
کد HTML:
# sed -n -e '5,7p' -e '10,13p' myfile.txt
4 - جایگزین کردن کلمات یا کاراکتر ها (جایگزینی ساده)
نکته: لطفا توجه کنید که آپشن -i موجب اعمال تغییرات به هنگام ویرایش میشود و چیزی در screen نمایش داده نمیشود و تنها درون فایل ذخیره میشود. در صورتی که میخواهید فقط خروجی دستور را ببینید از آپشن -i استفاده نکنید.
برای جایگزین کردن هر مورد از کلمه version با کلمه story در فایل myfile.txt دستور زیر را اجرا کنید :
کد HTML:
# sed -i 's/version/story/g' myfile.txt
بعلاوه ممکن است شما به منظور صرف نظر کردن از حروف بزرگ و کوچک به جای آپشن g در دستور بالا از gi استفاده کنید.
کد HTML:
# sed -i 's/version/story/gi' myfile.txt
برای جابه جا کردن چندین space خالی با تنها یک space ما از دستور ip route show و یک pipline به دستور sed همانند زیر استفاده میکنیم.
کد HTML:
# ip route show | sed 's/ */ /g'
خروجی دستور ip route show را با دستور بالا مقایسه کنید.
5 - جایگزینی کلمات یا کاراکترها در یک رنج (مثلا از خط 30 تا 40)
اگر شما بخواهید کلماتی را که تنها درون یک محدوده خاصی از خطوط هستند (به طور مثال از خط 30 تا 40) جایگزین کنید، از دستور زیر استفاده کنید.
کد HTML:
# sed -i '30,40 s/version/story/g' myfile.txt
البته شما میتوانید یک خط مجزا را از طریق عدد آن خط به جای مشخص کردن یک رنج استفاده کنید.
6 - استفاده از regular expression ها (جایگزینی پیشرفته) - شماره یک
بعضی اوقات درون فایل های config خطوط کامنت شده زیادی دارند. ممکن است که برای شما مفید باشد که تنها خطوط اصلی فایل کانفیگ بدون خطوط کامنت شده را بخواهید در یک نگاه ببینید.
برای حذف خط های خالی یا خط هایی که با علامت شارپ "#" شروع میشوند از فایل کانفیگ apache دستور زیر را اجرا کنید.
کد HTML:
# sed '/^#\|^$\| *#/d' /etc/httpd/conf/httpd.conf
علامت caret یا "^" مشخص کننده ابتدای یک خط است یعنی مثلا (^#) یعنی هر خطی که با # شروع شود. و علامت (^$) نمایش دهنده خطوطی هست که خالی هستند.
در این اینجا فایل کانفیگ apache خط هایی با #’s دارد، که در ابتدای خطوط نیستند، بنابراین برای حذف آنها از *# استفاده میکنیم.
7 - استفاده از regular expression (جایگزینی پیشرفته) - شماره دو
برای جا به جا کردن یک کلمه که با حروف بزرگ یا کوچک شروع میشود با کلمه دیگر نیز میتوان از دستور sed استفاده کرد. برای مثال کلمه zip یا Zip را با rar در فایل myfile.txt جابجا می کنیم.
کد HTML:
# sed -i 's/[Zz]ip/rar/g' myfile.txt
توصیه میشود این مقاله را هم مطالعه کنید :
نحوه استفاده از AWK و عبارات خاص برای فیلتر کردن متن یا رشته های متنی در فایل ها
8 - نمایش خط هایی که در آنها یک patern خاص موجود است
استفاده دیگر از دستور sed برای نمایش خطوطی از یک فایل است که با یک regular expression (عبارت خاص) داده شده match باشد. برای مثال ممکن است بخواهید فعالیت های login و logout کردن به سرور در 2 july را مشاهده کنید. (لاگ موجود در فایل var/log/secure در سرور centos 7)
در این مورد الگویی که برای جستجو کردن استفاده میکنیم jul 2 میباشد که در ابتدای هر خط موجود است.
کد HTML:
# sed -n '/^Jul 1/ p' /var/log/secure
9 - وارد کردن فاصله (space) در فایل ها
با دستور sed همچنین میتوانیم خط های خالی و یا space در یک فایل ایجاد کنیم. برای وارد کردن یک خط خالی ما بین تمامی خطوط (یک خط در میان یک خط خالی بندازیم) از دستور زیر به همراه نام فایل استفاده میکنیم.
کد HTML:
# sed -i G myfile.txt
برای وارد کردن 2 خط در بین تمامی خطوط همانند زیر عمل میکنیم.
کد HTML:
# sed -i 'G;G' myfile.txt
اگر شما میخواهید که خط های خالی بیشتری را بین خطوط اضافه کنید، از یک G بزرگ که به واسطه یک simicolon جدا شده استفاده کنید. مثال زیر دستورات بالا را درباره فایلی به نام LICENCE به شما نمایش خواهد داد.
اگر شما بخواهید یک فایل کانفیگ خیلی بزرگ را بررسی کنید این ترفند به شما بسیار کمک خواهد کرد. وارد کردن یک خط خالی مابین خطوط و pip کردن خروجی به دستور less به شما در خواندن بهتر خروجی کمک بسزایی خواهد کرد.
10 - شبیه سازی دستور dos2unix با استفاده از ادیتور sed
برنامه dos2unix فایل های plain text را از فرمت windows/mac به unix/unix تبدیل میکند. همچنین کاراکترهای new line مخفی را که توسط بعضی از ویرایشگرهای متنی و در آن پلتفرم خاص اضافه شده اند را حذف میکند. اگر روی سیستم تان نصب نبود شما میتوانید برای آن کاربرد و به جای نصب dos2unix از دستور sed استفاده کنید.
در تصویر سمت چپ شما میتوانید کاراکتر های DOS newline را (^M) مشاهده کنید که در تصویر بعد حذف شده اند.
کد HTML:
# sed -i 's/\r//' myfile.txt
لطفا توجه کنید که آپشن -i موجب اعمال تغییرات به هنگام ویرایش میشود و چیزی در screen نمایش داده نمیشود. و تنها درون فایل ذخیره میشود.
دقت کنید که شما میتوانید کاراکترهای dos newline را به هنگام ویرایش کردن یک فایل با ادیتور vi با استفاده از ctrl+V و ctrl+M وارد کنید.
همچنین توصیه میشود مطالعه کنید.
نصب و راه اندازی vi/vim در لینوکس
11 - ویرایش درجا و گرفتن backup از فایل اصلی
در قسمت قبلی ما از دستور sed برای تغییرات در محتوای فایل استفاده کردیم و تغییری در فایل اصلی ذخیره نکردیم. گاهی اوقات ذخیره یک backup از فایل اصلی در همان لحظه ایده ی بسیار خوبی است. برای این هدف از آپشن -i و یک پسوند (درون single quotes) برای تغییر نام فایل اصلی استفاده میکنیم.
در مثال زیر ما در فایل myfile.txt همه کلمات this یا This (بدون در نظر گرفتن حروف بزرگ یا کوچک) را با کلمه that جایگزین خواهیم کرد و همچنین فایل اصلی را با نام myfile.txt.orig ذخیره میکنیم و در نهایت از دستور diff برای بررسی تفاوتهای بین دو فایل استفاده می کنیم.
کد HTML:
# sed -i'.orig' 's/this/that/gi' myfile.txt
12 - فرض کنید شما فایلی شامل نام های کامل (با فرمت نام و نام خانوادگی) دارید
ممکن است شما برای بررسی بهتر فایل بخواهید که جای این فیلدها را با هم جابجا کنید. یعنی اول نام خانوادگی و بعد نام قرار گیرند.
با دستور sed به راحتی می توان این کار را انجام داد:
کد HTML:
# sed 's/^\(.*\),\(.*\)$/\2\, \1/g' names.txt
در تصویر بالا پرانتز اول نشان دهنده کاراکتر 1 و پرانتز دوم نشان دهنده کاراکتر 2 می باشد.
همچنین در دستور بالا :
1: نشان دهنده شروع هر خط تا علامت کاما (،) می باشد.
2: نشان دهنده هر چیزی بعد از کاما تا پایان خط می باشد.
خروجی مطلوب که در فرمت نمایش داده شده به این صورت است :
کد HTML:
SecondColumn (Last name) + comma + space + FirstColumn (First name)
که شما میتوانید آنرا به دلخواه خود تغییر دهید.
13- جایگزینی کلمات تنها در صورت یافتن یک الگوی خاص
گاهی اوقات شما نمیخواهید که تمام موارد موجود از یک کلمه را با کلمه ای دیگر جایگزین کنید و میخواهید تنها زمانی جایگزین شود که در آن خط یک کلمه ی خاص دیگر هم باشد.
برای مثال ممکن است بخواهید کلمه start را با stop تنها درخطی که کلمه ی service در آن است جایگزین کنید. در این سناریو ما فایل زیر را داریم:
کد HTML:
We need to start partying at work, but let’s remember to start all services first.
از آنجایی که در خط اول کلمه ی service وجود ندارد کلمه start با stop جایگزین نمیشود و تنها در خط دوم جایگزینی انجام میشود:
کد HTML:
# sed -i '/services/ s/start/stop/g' msg.txt
14 - اجرای همزمان دو مورد جایگزینی یا بیشتر
شما میتوانید چند مورد جایگزینی را تنها با یک خط کامند sed انجام دهید. در اینجا کلمات taht و line را با کلمات this و verse به ترتیب جایگزین میکنیم.
برای این منظور از دستور زیر استفاده میکنیم:
کد HTML:
# sed -i 's/that/this/gi;s/line/verse/gi' myfile.txt
همانند تصویر زیر :
15 - ترکیب دستور sed و دستورات دیگر
البته که میتوانیم دستور sed را با دیگر دستورات ترکیب کنیم و کامندهای قدرتمندی ایجاد کنیم. برای مثال از مثال مورد 4 استفاده میکنیم و ip address را از خروجی دستور ip route جدا می کنیم.
ما ابتدا با نمایش خطی که کلمه src در آن است شروع می کنیم. سپس چندین space را به یک space تبدیل میکنیم. در نهایت فیلد نهم (یک space را بعنوان جدا کننده ی (separator) فیلدها در نظر میگیریم) که مکان ip address هست را جدا میکنیم.
کد HTML:
# ip route show | sed -n '/src/p' | sed -e 's/ */ /g' | cut -d' ' -f9
تصویر زیر مراحل دستور بالا را نمایش میدهد:
خلاصه :
در این پست 15 ترفند از دستور sed را برای مدیریت بهتر کارهای روزانه سیستم مورد بحث قرار دادیم. باعث خوشحالیست اگر شما نیز ترفندی در استفاده از این دستور میدانید با ما به اشتراک بگذارید.
موفق باشید.
کامنت