Shell入門_去掉空行的幾種方法
昨天聽到一個很有意思的說法:腳本猛于老虎。
我非常認可這種說法,這里面有2個意思:
- 腳本的功能很強大,可以做很多事情,雖然不是最好的方式;
- 腳本很危險,很容易出錯;
或許還能加一句:伴君如伴虎...
我本人非常喜歡 shell 腳本,因為它做事太簡單粗暴了,適合用來實現 v0.01 版本原型,我甚至認為它很好地 輔助了軟件設計。
接下來是主題,做嵌入式軟件開發偶爾要收集和分析 log,有時為了格式化輸出需要刪除掉多余的空白行,我挑選了幾個 簡短且容易理解的 方法分享給大家。
1. grep
- $ grep -v '^$' file
-v 用于輸出不匹配的內容:
- $ man grep
- Matching Control
- -v, --invert-match
- Invert the sense of matching, to select non-matching lines.
通配符 '^里的用于表示字符串開始, 用于表示字符串結束。
2. sed
- $ sed '/^$/d' file
sed 的全名是 “stream editor”,即流編輯器,是一個使用簡單緊湊的編程語言來解析和轉換文本超強實用程序。
^$ 用于匹配空白行,d 則是 sed 的其中一個命令,用于刪除匹配項:
- $ man sed
- COMMAND SYNOPSIS
- ...
- d Delete pattern space. Start next cycle.
- ...
3. awk
- $ awk '!/^$/' file
補充知識:
awk (其名稱得自于它的創始人阿爾佛雷德·艾侯、彼得·溫伯格和布萊恩·柯林漢姓氏的首個字母) 是一種用于處理文本的編程語言。它是一個優良的文本處理工具,工作時它會掃描文件中的每一行,查找與命令行中所給定內容相匹配的模式。如果發現匹配內容,則進行下一個編程步驟。如果找不到匹配內容,則繼續處理下一行。
awk 程序是由一系列模式--動作對組成的:
- pattern { action }
回到我們的需求,^$ 用于匹配空白行,!則用來取反,從而找出非空白行,awk 的默認 action 就是 print,所以我們連 print 都不寫了。
4. tr
- $ cat in.txt | tr -s '\n'
tr 是 translate 的縮寫,用于替換或刪除輸入數據集中特定字符。
-s 用于將其輸出中相同相鄰字符的序列壓縮為單個字符:
- $ man tr
- DESCRIPTION
- -s, --squeeze-repeats
- replace each sequence of a repeated character that is listed in the last specified SET, with a single occurrence of
- that character
5. vi
- $ vi file
- :g/^$/d
vi 是一種模式編輯器。不同的按鈕和鍵擊可以更改不同的“模式”。
在命令模式下,g 指定全局搜索,^$ 用于匹配空白行,d 表示刪除匹配項。
到此,已經有足夠多的方法刪除空白行了。
后續會寫更多關于 shell 腳本的文章,內容包括但不限于:
- shell 腳本基礎知識;
- shell 腳本小技巧;
- shell 腳本編程規范;
- 分析 shell 腳本編寫的開源項目;
你喜歡 shell 嗎?大家有喜歡的文章和書籍麻煩也分享給我,謝謝~