天天看點

每個程式員都應該知道的8個Linux指令

摘要:Linux裡有很豐富的各種指令,有些是很難用的。然而,學會了前面說的這8個指令,你已經能處理大量的log分析任務了,完全不需要用腳本語言寫程式來處理它們。

每個程式員,在職業生涯的某個時刻,總會發現自己需要知道一些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 指令非常的簡單,你從下面的例子可以看到。

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  

如果你想看這些log檔案的内容,你可以把它們連接配接起來并輸出到标準輸出上,就是上面的例子展示的。這很有用,但輸出的内容可以更有邏輯些。

sort – 檔案裡的文字按行排序

此時sort指令顯然是你最佳的選擇。

jfields$ cat order.* | sort  

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, egrep, fgrep – 列印出比對條件的文字行

假設我們隻對Patterns of Enterprise Architecture這本書的訂單感興趣。使用grep,我們能限制隻輸出含有Patterns字元的訂單。

jfields$ cat order.* | sort | grep Patterns  

假設退款訂單113出了一些問題,你希望檢視所有相關訂單——你又需要使用grep了。

jfields$ cat order.* | sort | grep ":\d\d 113, "  

你會發現在grep上的比對模式除了“113”外還有一些其它的東西。這是因為113還可以比對上書目或價格,加上額外的字元後,我們可以精确的搜尋到我們想要的東西。

現在我們已經知道了退貨的詳細資訊,我們還想知道日銷售和退款總額。但我們隻關心《Patterns of Enterprise Architecture》這本書的資訊,而且隻關心數量和價格。我現在要做到是切除我們不關心的任何資訊。

cut – 删除檔案中字元行上的某些區域

又要使用grep,我們用grep過濾出我們想要的行。有了我們想要的行資訊,我們就可以把它們切成小段,删除不需要的部分資料。

jfields$ cat order.* | sort | grep Patterns | cut -d"," -f2,5  

 1, 39.99  

 -1, 39.99 

現在,我們把資料縮減為我們計算想要的形式,把這些資料粘貼到Excel裡立刻就能得到結果了。

cut是用來消減資訊、簡化任務的,但對于輸出内容,我們通常會有更複雜的形式。假設我們還需要知道訂單的ID,這樣可以用來關聯相關的其他資訊。我們用cut可以獲得ID資訊,但我們希望把ID放到行的最後,用單引号包上。

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' 

我們對例子中使用的正規表達式多說幾句,不過也沒有什麼複雜的。正規表達式做了下面幾種事情

删除時間戳

捕捉訂單号

删除訂單号後的逗号和空格

捕捉餘下的行資訊

裡面的引号和反斜杠有點亂,但使用指令行時必須要用到這些。

一旦捕捉到了我們想要的資料,我們可以使用 \1 & \2 來存儲它們,并把它們輸出成我們想要的格式。我們還在其中加入了要求的單引号,為了保持格式統一,我們還加入了逗号。最後,用cut指令把不必要的資料删除。

現在我們有麻煩了。我們上面已經示範了如何把log檔案消減成更簡潔的訂單形式,但我們的财務部門需要知道訂單裡一共有哪些書。

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 – 在檔案目錄中搜尋檔案

在上面的例子中我們處理了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 – 在檔案裡向前或向後移動

讓我們再回到簡單的 cat | sort 例子中來,下面的指令就是将經過合并、排序後的内容輸出到less指令裡。在 less 指令,使用“/”來執行向前搜尋,使用“?”指令執行向後搜尋。搜尋條件是一個正規表達式。

jfields$ cat order* | sort | less 

如果你在 less 指令裡使用 /113.*,所有113訂單的資訊都會高亮。你也可以試試?.*112,所有跟訂單112相關的時間戳都會高亮。最後你可以用 ‘q’ 來退出less指令。

Linux裡有很豐富的各種指令,有些是很難用的。然而,學會了前面說的這8個指令,你已經能處理大量的log分析任務了,完全不需要用腳本語言寫程式來處理它們。

繼續閱讀