حذف خطوط خالی از فایل – Bash
توسط: vahit
هنگام نوشتن یه اسکریپت Bash ممکنه لازم داشته باشیم که خطوط خالی یک فایل رو برای پردازش هر چه راحتتره اون نادیده بگیریم امّا چطور باید اینکار رو بکنیم؟!
اگر با دستور grep کار کرده باشید میدونید که کارش جستجوی یک الگو داخل یک فایل یا یک استریم هست و خروجیش همهی خطوطی هست که داخل اون الگو صدق میکنن. برای مثال دستور زیر رو در نظر بگیرید:
1 2 3 4 5 6 7 8 |
$ 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 شروع میشن رو برگردونه (کاراکتر ^ برای نشون دادن ابتدای خط به کار میره):
1 2 3 |
$ lsmod | grep --ignore-case "^brcm" brcmsmac 536576 0 brcmutil 16384 1 brcmsmac |
یا به عنوان یک مثال دیگه، دستور زیر با استفاده از یک دستور grep دیگه، همهی خطوطی که به حرف c ختم میشن رو نشون میده. برای این کار از الگوی “$” برای نشون دادن آخر خط استفاده میکنه:
1 2 |
$ lsmod | grep --ignore-case "^brcm" | grep "c$" brcmutil 16384 1 brcmsmac |
دستور grep آپشنی به اسم invert-match داره که خروجی رو برعکس میکنه، یعنی همهی خطوطی که در الگو صدق نمیکنن رو چاپ میکنه. برای مثال دستور زیر همهی خطوط فایل resolve.conf رو نشون میده بغیر از اونهایی که شامل کاراکتر # هستن:
1 2 3 4 5 |
$ 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 همهی خطوطی که شامل این الگو نمیشن رو فقط نشون بدیم. الگوی ”^$“ از این جهت شامل خطوط خالی میشه که بین نشانگر اوّل خط (^) و نشانگر آخر خط ($) هیچ کاراکتر دیگهای وجود نداره! برای مثال به دستورات زیر توجه کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ 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 :) |