منبع اصلی نوشتار زیر در این لینک قرار دارد

حذف خطوط خالی از فایل – Bash

postسلام

هنگام نوشتن یه اسکریپت Bash ممکنه لازم داشته باشیم که خطوط خالی یک فایل رو برای پردازش هر چه راحتتره اون نادیده بگیریم امّا چطور باید اینکار رو بکنیم؟!

اگر با دستور grep کار کرده باشید می‌دونید که کارش جستجوی یک الگو داخل یک فایل یا یک استریم هست و خروجیش همه‌ی خطوطی هست که داخل اون الگو صدق می‌کنن. برای مثال دستور زیر رو در نظر بگیرید:

$ lsmod | grep --ignore-case brcm
brcmsmac              536576  0
cordic                 16384  1 brcmsmac
brcmutil               16384  1 brcmsmac
bcma                   49152  2 brcmsmac
mac80211              651264  1 brcmsmac
cfg80211              475136  2 brcmsmac,mac80211
led_class              16384  2 brcmsmac,rtsx_usb_sdmmc

بخش دوّم دستور که ورودیش رو از طریق پایپ (‪pipe (|)‬) از دستور lsmod گرفته همه‌ی خطوطی که توی اونها عبارت brcm وجود داره رو نشون می‌ده و بقیه رو حذف می‌کنه. آپشن ignore-case دستور grep رو در جریان این کار می‌زاره که نیازی به بررسی بزرگ یا کوچک بودن حروف عبارت نیست. یا مثلاً دستور زیر با استفاده از الگوی “^” به دستور grep می‌فهمونه که همه‌ی خطوطی که با الگوری brcm شروع می‌شن رو برگردونه (کاراکتر ^ برای نشون دادن ابتدای خط به کار می‌ره):

$ lsmod | grep --ignore-case "^brcm"
brcmsmac              536576  0
brcmutil               16384  1 brcmsmac

یا به عنوان یک مثال دیگه، دستور زیر با استفاده از یک دستور grep دیگه، همه‌ی خطوطی که به حرف c ختم می‌شن رو نشون می‌ده. برای این کار از الگوی “$” برای نشون دادن آخر خط استفاده می‌کنه:

$ lsmod | grep --ignore-case "^brcm" | grep "c$"  
brcmutil               16384  1 brcmsmac

دستور grep آپشنی به اسم invert-match داره که خروجی رو برعکس می‌کنه، یعنی همه‌ی خطوطی که در الگو صدق نمی‌کنن رو چاپ می‌کنه. برای مثال دستور زیر همه‌ی خطوط فایل resolve.conf رو نشون می‌ده بغیر از اونهایی که شامل کاراکتر # هستن:

$ cat /etc/resolv.conf                          
# Generated by resolvconf
nameserver 192.168.42.129
$ cat /etc/resolv.conf | grep --invert-match "#"
nameserver 192.168.42.129

خب این همه صغرا و کبرا چیدیم که برسیم به اینجا که وقتی لازم داشتیم که خطوط خالی یک فایل رو حذف کنیم می‌تونیم از دستور grep با ترکیب آپشن‌ها و الگوهایی که بررسی کردیم استفاده کنیم. یعنی از الگوی ‪”^$“‬ برای تشخیص خطوط خالی استفاده کنیم و با استفاده از آپشن invert-match همه‌ی خطوطی که شامل این الگو نمی‌شن رو فقط نشون بدیم. الگوی ‪”^$“‬ از این جهت شامل خطوط خالی می‌شه که بین نشانگر اوّل خط (^) و نشانگر آخر خط ($) هیچ کاراکتر دیگه‌ای وجود نداره! برای مثال به دستورات زیر توجه کنید:

$ cat empty-lines.txt 
Hello
This file is a test file



for empty

lines.

Take it easy :)
$ cat empty-lines.txt | grep -v "^$"                     
Hello
This file is a test file
for empty
lines.
Take it easy :)

 

 



برچسب ها : , , , ,

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

به اين صفحه امتياز دهيد