اطلاعیه

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

نحوه استفاده از دستور AWK برای فیلتر کردن متن یا رشته های متنی با استفاده از اکشن های خاص Patern بخش 3

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

    نحوه استفاده از دستور AWK برای فیلتر کردن متن یا رشته های متنی با استفاده از اکشن های خاص Patern بخش 3

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

    گاهی اوقات به هنگام فیلتر متن میخواهید که خط های خاصی از یک فایل ورودی و یا خط هایی از رشته های بر اساس یک شرط داده شده و یا همچنین با استفاده از یک الگوی خاص که با عبارت match شود را نمایش دهیم. انجام چنین کارهایی با awk آسان است و در حقیقت اینها قابلیت های بی نظیری از این دستور هستند که به شما کمک خواهند کرد.

    در مثال زیر فایلی با نام food_prices.list میبینید که یک لیست خرید است و شامل آیتم های غذایی هست که شما میخواهید بخرید. و شامل لیست مواد غذایی و قیمت های آنها میباشد :
    کد PHP:
    cat food_prices.list
    No    Item_Name        Quantity    Price
    1    Mangoes               10        
    $2.45
    2    Apples               20        
    $1.50
    3    Bananas               5        
    $0.90
    4    Pineapples           10        
    $3.46
    5    Oranges               10        
    $0.78
    6    Tomatoes           5        
    $0.55
    7    Onions               5            
    $0.45 

    اکنون میخواهید مواد غذایی که قیمت آنها بیشتر از 2 دلار باشد را با استفاده از علامت ستاره (*) در پایان آن خط مشخص کنید. این کار با استفاده از دستور زیر انجام میشود.
    کد PHP:
    awk '/ *\$[2-9]\.[0-9][0-9] */ {print $1, $2, $3, $4, "*" ;} / *\$[0-1]\.[0-9][0-9] */ {print;}' food_prices.list 
    کد PHP:
    [mohammad@localhost ~]$ awk '/ *\$[2-9]\.[0-9][0-9] */ {print $1, $2, $3, $4, "*" ;} / *\$[0-1]\.[0-9][0-9] */ {print;}' food_prices.list
    1 Mangoes 10 $2.45 *
    2    Apples               20        $1.50
    3    Bananas               5        
    $0.90
    4 Pineapples 10 
    $3.46 *
    5    Oranges               10        $0.78
    6    Tomatoes           5        
    $0.55
    7    Onions               5            
    $0.45
    [mohammad@localhost ~]$ 
    همانطور که در خروجی بالا میبینید یک علامت * در پایان خط هایی که آیتم غذایی آنها mangoes (انبه) یا pineapples (آناناس) است قرار گرفته اگر شما قیمت آنها را چک کنید بیشتر از 2 دلار هستند.

    در این مثال ما از 2 الگو استفاده کردیم :

    اول / *\$[2-9]\.[0-9][0-9] */ خط هایی را بر میگرداند که قیمت ایتم غذایی بیشتر از 2 دلار باشد و

    دوم /*\$[0-1]\.[0-9][0-9] */ دنبال خط هایست که قیمت آیتم غذایی کمتر از 2$ باشد.


    اتفاقی که میافتد این است که زمانی که یک الگو با قیمت ایتم غذایی بزرگتر از 2$ مچ میشود تمامی 4 فیلد موجود به همراه علامت * در پایان آن خط print میشود.

    patern دوم خط های دیگر را که قیمت غذا کمتر از 2$ باشد که در فایل ورودی food_prices.list موجود میباشد را print میکند.

    به این شیوه شما میتوانید از action های خاص یک patern برای فیلتر کردن آیتم های غذایی که قیمت شان بیشتر از 2$ هست استفاده کنید. اگر چه مشکلی در خروجی وجود دارد خط هایی که علامت * دارند همانند بقیه خط ها فرمت شده نیستند و خروجی به اندازه کافی واضح نیست. ما مشکل شبیه به این را در پارت دوم از سری آموزش های AWK داشتیم و میتوانیم آن را به 2 شیوه رفع کنیم :

    1 - استفاده از دستور printf که راهی طولانی و خسته کننده هست و از طریق دستور زیر امکان پذیر است :
    کد PHP:
    awk '/ *\$[2-9]\.[0-9][0-9] */ { printf "%-10s %-10s %-10s  %-10s\n", $1, $2, $3, $4 "*" ; } / *\$[0-1]\.[0-9][0-9] */ { printf  "%-10s %-10s %-10s %-10s\n", $1, $2, $3, $4; }' food_prices.list 
    کد PHP:
    [mohammad@localhost ~]$ awk '/ *\$[2-9]\.[0-9][0-9] */ { printf  "%-10s %-10s %-10s %-10s\n", $1, $2, $3, $4 "*" ; } /  *\$[0-1]\.[0-9][0-9] */ { printf "%-10s %-10s %-10s %-10s\n", $1, $2,  $3, $4; }' food_prices.list
    1          Mangoes    10         $2.45*    
    2          Apples     20         $1.50    
    3          Bananas    5          
    $0.90    
    4          Pineapples 10         
    $3.46*    
    5          Oranges    10         $0.78    
    6          Tomatoes   5          
    $0.55    
    7          Onions     5          
    $0.45    
    [mohammad@localhost ~]$ 
    2 - استفاده از فیلد $0 میباشد. AWK از متغییر 0 برای ذخیره کردن کل یک خط ورودی استفاده میکند. برای حل مشکل بالا استفاده از این فیلد بسیار آسان و سریع همانند زیر میباشد :
    کد PHP:
    awk '/ *\$[2-9]\.[0-9][0-9] */ { print $0 "*" ; } / *\$[0-1]\.[0-9][0-9] */ { print ; }' food_prices.list 
    کد PHP:
    [mohammad@localhost ~]$ awk '/ *\$[2-9]\.[0-9][0-9] */ { print $0 "*" ; } / *\$[0-1]\.[0-9][0-9] */ { print ; }' food_prices.list
    1    Mangoes               10        $2.45*
    2    Apples               20        $1.50
    3    Bananas               5        
    $0.90
    4    Pineapples           10        
    $3.46*
    5    Oranges               10        $0.78
    6    Tomatoes           5        
    $0.55
    7    Onions               5            
    $0.45
    [mohammad@localhost ~]$ 
    نتیجه :
    راه های ساده ای برای فیلتر کردن متن با استفاده از اکشن خاص الگویی وجود دارد که میتوان در مشخص کردن خط هایی از متن یا رشته یا یک فایل با استفاده از دستور AWK از آنها بهره جست.

    امیدوارم این پست برای شما مفید واقع شده باشد و به شما توصیه میکنم که حتما پست سری بعدی را نیز مطالعه بفرمایید که در مورد استفاده از عملگرهای مقایسه در ابزار awk میباشد.
    آخرین ویرایش توسط Habili; در تاریخ/ساعت 07-14-2019, 02:37 PM.

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

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

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