اطلاعیه

بستن
هنوز اطلاعیه ای در دست نیست.

15 ترفند از دستور sed برای کارهای مدیریتی روزانه در لینوکس

بستن
X
 
  • فیلتر کردن
  • زمان
  • نمایش
Clear All
پست های جدید

    15 ترفند از دستور sed برای کارهای مدیریتی روزانه در لینوکس

    هر ادمین لینوکس، روزانه با فایل های متنی زیادی سر و کار دارد. دانستن نحوه نمایش بخش های خاص، نحوه جابه جایی کلمات و همچنین فیلتر کردن محتوا از این فایل ها، همه و همه مهارت هایی هستند که شما باید بدون نیاز به سرچ گوگل تمام آنها را بدانید. در این مقاله ما دستور sed را مرور خواهیم کرد که یک ادیتور شناخته شده میباشد و 15 ترفند برای استفاده به منظور دسترسی به هدف هایی که در بالا اشاره شد را با شما به اشتراک میگذاریم.



    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
    همانطور که میبینید آپشن -e به شما این امکان را میدهد تا یک بخش داده شده (در اینجا منظور نمایش خط ها میباشد) برای هر رنج را اجرا کنید.






    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 را با دستور بالا مقایسه کنید.

    برای دیدن سایز بزرگ روی عکس کلیک کنید  نام: Replace-Words-Characters-in-File-linux-zone-org-forums.png مشاهده: 1 حجم: 6.4 کیلو بایت








    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
    برای دیدن سایز بزرگ روی عکس کلیک کنید  نام: View-Logs-of-Particular-Date-linux-zone-org-forums.png مشاهده: 1 حجم: 11.3 کیلو بایت







    9 - وارد کردن فاصله (space) در فایل ها

    با دستور sed همچنین میتوانیم خط های خالی و یا space در یک فایل ایجاد کنیم. برای وارد کردن یک خط خالی ما بین تمامی خطوط (یک خط در میان یک خط خالی بندازیم) از دستور زیر به همراه نام فایل استفاده میکنیم.
    کد HTML:
    # sed -i G myfile.txt



    برای وارد کردن 2 خط در بین تمامی خطوط همانند زیر عمل میکنیم.
    کد HTML:
    # sed -i 'G;G' myfile.txt



    اگر شما میخواهید که خط های خالی بیشتری را بین خطوط اضافه کنید، از یک G بزرگ که به واسطه یک simicolon جدا شده استفاده کنید. مثال زیر دستورات بالا را درباره فایلی به نام LICENCE به شما نمایش خواهد داد.

    برای دیدن سایز بزرگ روی عکس کلیک کنید  نام: Insert-Blank-Spaces-in-File-linux-zone-org-forums.png مشاهده: 1 حجم: 14.1 کیلو بایت





    اگر شما بخواهید یک فایل کانفیگ خیلی بزرگ را بررسی کنید این ترفند به شما بسیار کمک خواهد کرد. وارد کردن یک خط خالی مابین خطوط و 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
    برای دیدن سایز بزرگ روی عکس کلیک کنید  نام: Covert-Text-Files-from-Windows-to-Linux-linux-zone-org-forums.png مشاهده: 1 حجم: 4.4 کیلو بایت





    لطفا توجه کنید که آپشن -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
    برای دیدن سایز بزرگ روی عکس کلیک کنید  نام: Sed-Edit-and-Backup-Original-File-linux-zone-org-forums.png مشاهده: 1 حجم: 7.7 کیلو بایت







    12 - فرض کنید شما فایلی شامل نام های کامل (با فرمت نام و نام خانوادگی) دارید

    ممکن است شما برای بررسی بهتر فایل بخواهید که جای این فیلدها را با هم جابجا کنید. یعنی اول نام خانوادگی و بعد نام قرار گیرند.


    با دستور sed به راحتی می توان این کار را انجام داد:
    کد HTML:
    # sed 's/^\(.*\),\(.*\)$/\2\, \1/g' names.txt
    برای دیدن سایز بزرگ روی عکس کلیک کنید  نام: Switch-Words-in-File-linux-zone-org-forums.png مشاهده: 1 حجم: 7.7 کیلو بایت





    در تصویر بالا پرانتز اول نشان دهنده کاراکتر 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
    برای دیدن سایز بزرگ روی عکس کلیک کنید  نام: Replace-Words-in-File-linux-zone-org-forums.png مشاهده: 1 حجم: 4.5 کیلو بایت







    14 - اجرای همزمان دو مورد جایگزینی یا بیشتر

    شما میتوانید چند مورد جایگزینی را تنها با یک خط کامند sed انجام دهید. در اینجا کلمات taht و line را با کلمات this و verse به ترتیب جایگزین میکنیم.


    برای این منظور از دستور زیر استفاده میکنیم:
    کد HTML:
    # sed -i 's/that/this/gi;s/line/verse/gi' myfile.txt



    همانند تصویر زیر :
    برای دیدن سایز بزرگ روی عکس کلیک کنید  نام: Replace-Each-Word-with-New-Word-linux-zone-org-forums.png مشاهده: 1 حجم: 6.8 کیلو بایت







    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


    تصویر زیر مراحل دستور بالا را نمایش میدهد:

    برای دیدن سایز بزرگ روی عکس کلیک کنید  نام: Combine-sed-with-Other-Commands-linux-zone-org-forums.png مشاهده: 1 حجم: 6.9 کیلو بایت






    خلاصه :
    در این پست 15 ترفند از دستور sed را برای مدیریت بهتر کارهای روزانه سیستم مورد بحث قرار دادیم. باعث خوشحالیست اگر شما نیز ترفندی در استفاده از این دستور میدانید با ما به اشتراک بگذارید.

    موفق باشید.
    آخرین ویرایش توسط Habili; در تاریخ/ساعت 09-26-2021, 10:43 AM.
    Instagram : https://www.instagram.com/iranlinuxforum

    Voip Trainer - Asterisk - Elastix - Agi Programming- NewRock

    Voip Expert :ASTERISK-ELASTIX-NewRock Certified-With Experience of Working With
    Sangoma-Digium-Openvox-Synway-Atcom-Quintum Tenor-Polycom-Yealink-Rtx-Snom
    Cisco Collaboration - CME-CUCM-CUPs-CUC-WEBEX
    LPI ( Fundamental - LPI1 and LPI2 ) - Monitoring: ZABBIX-VOIPMONITOR-NAGIOS - CCNA

    Linkedin Profile : https://www.linkedin.com/in/masuma-vahid-26b17b66/

    #2
    برای حذف تمامی خطوط یک فایل با یک کلمه خاص هم میتوان از دستور زیر استفاده کرد. مثلا در سناریویی که امروز درگیر بودم، مجبور شدم تمامی خطوط یک فایل چندین هزار خطی را که از کلمه "linux-zone" استفاده میکرد، حذف کنم.

    مثال 1 :
    برای حذف تمامی خطوط فایل language.xml که از عبارت "linux-zone" استفاده میکند و ریختن خروجی دستور درون یک فایل دیگر از دستور زیر استفاده میکنیم. (هیچ تغییری در خطوط فایل اصلی ایجاد نخواهد شد)
    کد HTML:
    $ sed '/linux-zone/d' language.xml > messages.txt

    مثال 2 :
    برای حذف تمامی خطوط language.xml که عبارت "linux-zone" را دارد، از دستور زیر استفاده میکنیم. (این دستور خروجی ندارد و مستقیما روی خود فایل اعمال میشود)
    کد HTML:
    $ sed -i '/linux-zone/d' language.xml
    آخرین ویرایش توسط Habili; در تاریخ/ساعت 07-08-2019, 01:11 AM.

    کامنت

    درباره انجمن منطقه لینوکسی ها

    انجمن منطقه لینوکسی ها با هدف ارتقاء سطح علمی کاربران در سطح جهانی و همچنین کمک به بالا بردن سطح علمی عمومی در زمینه های تخصصی فوق پایه گذاری شده است. انجمن منطقه لینوکسی ها از طریق کارشناسان و متخصصان پاسخگوی سوالات گوناگون کاربران مبتدی یا پیشرفته میباشد تا حد امکان تلاش شده که محیطی متنوع و کاربر پسند و به دور از هرگونه حاشیه جهت فعالیت کاربران در این انجمن ایجاد شود. لذا ما به صورت مستمر برای پیشرفت کمی و کیفی محتوی و اطلاعات انجمنمان میکوشیم که این برای ما ارزشمند و حائز اهمیت است. کلیه حقوق،اطلاعات و مقالات در این انجمن متعلق به سایت منطقه لینوکسی ها میباشد، و هرگونه نسخه برداری بدون ذکر منبع مورد پیگرد قانونی خواهد شد.

    شبکه های اجتماعی
    در حال انجام ...
    X