iT邦幫忙

DAY 19
6

快快樂樂學會讓電腦幫我做事系列 第 16

[Shell Script] Day19-常用的指令介紹之grep和awk

我深深覺得 grepawk 真是天生一對的好兄弟阿! 讚
我深深覺得 grepawk 真是天生一對的好兄弟阿!

為什麼我會這麼說呢?因為這兩個指令搭配著使用就可以縱橫文件表格了!
這樣的描述或許是太過於模糊,因此我先簡單介紹一下grepawk的主要目的,再來個小範例讓大家更清楚知道怎麼去使用grepawk

首先,grep 的主要目的是從文件中找關鍵字,接者再把有關鍵字的那一整行給列印出來。而 awk 列印的可就不是一整行,是可以選擇性的列印一整欄

比如說下面有一個表格:
編號 / 名稱 / 序號
A001 腳踏車 AEADDDEE9931
A002 機車 FDEAEDFJK3394
A003 火車 FJDKE3AK34940
A004 超機車 FFJJEEE99300
A005 飛機 AIRP33333900
A006 坦克 TANK00000001

而我想找所有有關鍵字「車」,並且列印他的名稱和序號。因此我可以先用 grep 找出所有含「車」的資料,再用 awk 列印我要的欄位 – 編號序號

步驟一,使用 grep 取得所有有車的資料
(上述資料是存放在檔案名車為 Day19TestData.txt 中)

# grep 使用方式(當然用法不只這樣,這裡只先介紹我們所需要的簡單用法)
grep 關鍵字 檔案名稱

執行結果:

可是我們需要的只有 名稱 和 序號而已阿!
所以 grep 幫我們處理完「行」之後,再把結果交由 awk 來處理「欄」。

awk {‘print $欄位 $欄位 $欄位 ….’}

因為我們需要的欄位是第 2 和第 3,所以我們會輸入 awk {‘print $2 $3’}
不過這樣輸入會有一個小問題,也就是輸出的結果會連在一塊兒。

比如說第二欄位是 超機車 第三欄位是 ABCDEF000001,所以輸出的結果就會是:超機車ABCDEF000001

所以當我們希望在輸出結果的欄位中插入一個符號,就算是空白也好都需要雙引號的協助。

因此我們會這樣輸入: awk {'print $2" - "$3'} Day19TestData.txt
所以結果就會是:

『不對阿!這根當初要的需求不太一樣阿!』

的確,是不是我們要的。因為我們是直接拿 Day19TestData .txt 來操作!
所以,正確來說我們應該用以下步驟來操作才可以得到我們想要的結果:

  1. 先用 grep 取得我們要的資料(列處理)
  2. 再用 awk 處理 grep 處理過的資料(欄處理)

這樣就可以得到我們所要的資料了。只是,這樣處理兩次似乎麻煩了些,如果檔案資料太多,可能也會慢一些。所以我們可以用 pipe 來一此完成這個動作!

所謂的 pipe (|) 就是把第一個指令處理的結果直接當成參數給第二個指令當成輸入來處理。所以我們可以這樣做:

# 把 command1 的結果當成 command2 的輸入
# 再把 command2 的結果給 command3 當輸入
# …以此類推
Command1 | command2 | command3 | ….

最後,我們就可以這樣寫我們要的 script
grep "車" Day19TestData.txt | awk {'print $2" - "$3'}

這樣我們就可以取得我們要的資料了!當然,grep 和 awk 用法絕對不是只有這樣,如果想資到更詳細的用法,可以請問一下男人(man)或者估狗大神!讚

來個小練習吧:
我們都知道用 ll 可以顯示當前資料夾的檔案明細,像這樣:

如果我想產生一份資是只顯示大於 100 bytes 的檔案清單,在清單中我只要檔案名稱、檔案大小及檔案擁有著,如下格式:
檔案名稱 / 檔案擁有著 / 檔案大小

想一想該怎麼做呢?應該不難吧!明天揭曉!!!

上一篇 常用的指令介紹之男人與時間
下一篇 常用的指令介紹之快速搜尋取代文件內容


上一篇
[Shell Script] Day18-常用的指令介紹之男人與時間
下一篇
[Shell Script] Day20-常用的指令介紹之快速搜尋取代文件內容
系列文
快快樂樂學會讓電腦幫我做事27

2 則留言

我要留言

立即登入留言