文章目錄
- cat
- sort
- grep
- cut
- sed
- uniq
- find
- less
每個程式員,在職業生涯的某個時刻,總會發現自己需要知道一些Linux方面的知識。我並不是說你應該成為一個Linux專家,我的意思是,當面對Linux命令列任務時,你應該能很熟練的完成。事實上,學會了下面8個命令,我基本上能完成任何需要完成的任務。
注意:下面的每個命令都有十分豐富的文檔說明。這篇文章並不是來詳盡的展示每個命令的各種功用的。我在這裡要講的是這幾個最常用的命令的最常見用法。如果你對linux命令並不是很瞭解,你想找一些這方面的資料學習,那這篇文章將會給你一個基本的指導。
讓我們從處理一些資料開始。假設我們有兩個檔案,分別記錄的訂單清單和訂單處理結果。
- order.out.log
- 8:22:19 111, 1, Patterns of Enterprise Architecture, Kindle edition, 39.99
- 8:23:45 112, 1, Joy of Clojure, Hardcover, 29.99
- 8:24:19 113, -1, Patterns of Enterprise Architecture, Kindle edition, 39.99
-
- order.in.log
- 8:22:20 111, Order Complete
- 8:23:50 112, Order sent to fulfillment
- 8:24:20 113, Refund sent to processing
cat
cat – 串連檔案,並輸出結果
cat 命令非常的簡單,你從下面的例子可以看到。
- jfields$ cat order.out.log
- 8:22:19 111, 1, Patterns of Enterprise Architecture, Kindle edition, 39.99
- 8:23:45 112, 1, Joy of Clojure, Hardcover, 29.99
- 8:24:19 113, -1, Patterns of Enterprise Architecture, Kindle edition, 39.99
就像它的說明描述的,你可以用它來串連多個檔案。
- jfields$ cat order.*
- 8:22:20 111, Order Complete
- 8:23:50 112, Order sent to fulfillment
- 8:24:20 113, Refund sent to processing
- 8:22:19 111, 1, Patterns of Enterprise Architecture, Kindle edition, 39.99
- 8:23:45 112, 1, Joy of Clojure, Hardcover, 29.99
- 8:24:19 113, -1, Patterns of Enterprise Architecture, Kindle edition, 39.99
如果你想看這些log檔案的內容,你可以把它們串連起來並輸出到標準輸出上,就是上面的例子展示的。這很有用,但輸出的內容可以更有邏輯些。
sort
sort – 檔案裡的文字按行排序
此時sort命令顯然是你最佳的選擇。
- jfields$ cat order.* | sort
- 8:22:19 111, 1, Patterns of Enterprise Architecture, Kindle edition, 39.99
- 8:22:20 111, Order Complete
- 8:23:45 112, 1, Joy of Clojure, Hardcover, 29.99
- 8:23:50 112, Order sent to fulfillment
- 8:24:19 113, -1, Patterns of Enterprise Architecture, Kindle edition, 39.99
- 8:24:20 113, Refund sent to processing
就像上面例子顯示的,檔案裡的資料已經經過排序。對於一些小檔案,你可以讀取整個檔案來處理它們,然而,真正的log檔案通常有大量的內容,你不能不考慮這個情況。此時你應該考慮過濾出某些內容,把cat、sort後的內容通過管道傳遞給過濾工具。
grep
grep, egrep, fgrep – 列印出匹配條件的文字行
假設我們只對Patterns of Enterprise Architecture這本書的訂單感興趣。使用grep,我們能限制只輸出含有Patterns字元的訂單。
- jfields$ cat order.* | sort | grep Patterns
- 8:22:19 111, 1, Patterns of Enterprise Architecture, Kindle edition, 39.99
- 8:24:19 113, -1, Patterns of Enterprise Architecture, Kindle edition, 39.99
假設退款訂單113出了一些問題,你希望查看所有相關訂單——你又需要使用grep了。
- jfields$ cat order.* | sort | grep ":\d\d 113, "
- 8:24:19 113, -1, Patterns of Enterprise Architecture, Kindle edition, 39.99
- 8:24:20 113, Refund sent to processing
你會發現在grep上的匹配模式除了“113”外還有一些其它的東西。這是因為113還可以匹配上書目或價格,加上額外的字元後,我們可以精確的搜尋到我們想要的東西。
現在我們已經知道了退貨的詳細資料,我們還想知道日銷售和退款總額。但我們只關心《Patterns of Enterprise Architecture》這本書的資訊,而且只關心數量和價格。我現在要做到是切除我們不關心的任何資訊。
cut
cut – 刪除檔案中字元行上的某些地區
又要使用grep,我們用grep過濾出我們想要的行。有了我們想要的行資訊,我們就可以把它們切成小段,刪除不需要的部分資料。
- jfields$ cat order.* | sort | grep Patterns
- 8:22:19 111, 1, Patterns of Enterprise Architecture, Kindle edition, 39.99
- 8:24:19 113, -1, Patterns of Enterprise Architecture, Kindle edition, 39.99
-
- jfields$ cat order.* | sort | grep Patterns | cut -d"," -f2,5
- 1, 39.99
- -1, 39.99
現在,我們把資料縮減為我們計算想要的形式,把這些資料粘貼到Excel裡立刻就能得到結果了。
cut是用來消減資訊、簡化任務的,但對於輸出內容,我們通常會有更複雜的形式。假設我們還需要知道訂單的ID,這樣可以用來關聯相關的其他資訊。我們用cut可以獲得ID資訊,但我們希望把ID放到行的最後,用單引號包上。
sed
sed – 一個流編輯器。它是用來在輸入資料流上執行基本的文本變換。
下面的例子展示了如何用sed命令變換我們的檔案行,之後我們在再用cut移除無用的資訊。
- jfields$ cat order.* | sort | grep Patterns \
- >| sed s/"[0-9\:]* \([0-9]*\)\, \(.*\)"/"\2, '\1'"/
- 1, Patterns of Enterprise Architecture, Kindle edition, 39.99, '111'
- -1, Patterns of Enterprise Architecture, Kindle edition, 39.99, '113'
-
- lmp-jfields01:~ jfields$ cat order.* | sort | grep Patterns \
- >| sed s/"[0-9\:]* \([0-9]*\)\, \(.*\)"/"\2, '\1'"/ | cut -d"," -f1,4,5
- 1, 39.99, '111'
- -1, 39.99, '113'
我們對例子中使用的Regex多說幾句,不過也沒有什麼複雜的。Regex做了下面幾種事情
- 刪除時間戳記
- 捕捉訂單號
- 刪除訂單號後的逗號和空格
- 捕捉餘下的行資訊
裡面的引號和反斜線有點亂,但使用命令列時必須要用到這些。
一旦捕捉到了我們想要的資料,我們可以使用 \1 & \2 來儲存它們,並把它們輸出成我們想要的格式。我們還在其中加入了要求的單引號,為了保持格式統一,我們還加入了逗號。最後,用cut命令把不必要的資料刪除。
現在我們有麻煩了。我們上面已經示範了如何把log檔案消減成更簡潔的訂單形式,但我們的財務部門需要知道訂單裡一共有哪些書。
uniq
uniq – 重複資料刪除的行
下面的例子展示了如何過濾出跟書相關的交易,刪除不需要的資訊,獲得一個不重複的資訊。
- jfields$ cat order.out.log | grep "\(Kindle\|Hardcover\)" | cut -d"," -f3 | sort | uniq -c
- 1 Joy of Clojure
- 2 Patterns of Enterprise Architecture
看起來這是一個很簡單的任務。
這都是很好用的命令,但前提是你要能找到你想要的檔案。有時候你會發現一些檔案藏在很深的檔案夾裡,你根本不知道它們在哪。但如果你是知道你要尋找的檔案的名字的話,這對你就不是個問題了。
find
find – 在檔案目錄中搜尋檔案
在上面的例子中我們處理了order.in.log和order.out.log這兩個檔案。這兩個檔案放在我的home目錄裡的。下面了例子將向大家展示如何在一個很深的目錄結構裡找到這樣的檔案。
- jfields$ find /Users -name "order*"
- Users/jfields/order.in.log
- Users/jfields/order.out.log
find命令有很多其它的參數,但99%的時間裡我只需要這一個就夠了。
簡單的一行,你就能找到你想要的檔案,然後你可以用cat查看它,用cut修剪它。但檔案很小時,你用管道把它們輸出到螢幕上是可以的,但當檔案大到超出螢幕時,你也許應該用管道把它們輸出給less命令。
less
less – 在檔案裡向前或向後移動
讓我們再回到簡單的 cat | sort 例子中來,下面的命令就是將經過合并、排序後的內容輸出到less命令裡。在 less 命令,使用“/”來執行向前搜尋,使用“?”命令執行向後搜尋。搜尋條件是一個Regex。
- jfields$ cat order* | sort | less
如果你在 less 命令裡使用 /113.*,所有113訂單的資訊都會高亮。你也可以試試?.*112,所有跟訂單112相關的時間戳記都會高亮。最後你可以用 ‘q’ 來退出less命令。
Linux裡有很豐富的各種命令,有些是很難用的。然而,學會了前面說的這8個命令,你已經能處理大量的log分析任務了,完全不需要用指令碼語言寫程式來處理它們。