每一個程序員,在職業生涯的某個時刻,總會發現本身須要知道一些Linux方面的知識。我並非說你應該成爲一個Linux專家,個人意思是,當面對linux命令行任務時,你應該能很熟練的完成。事實上,學會了下面8個命令,我基本上能完成任何須要完成的任務。 linux
注意:下面的每一個命令都有十分豐富的文檔說明。這篇文章並非來詳盡的展現每一個命令的各類功用的。我在這裏要講的是這幾個最經常使用的命令的最多見用法。若是你對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 – 鏈接文件,並輸出結果 less
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命令顯然是你最佳的選擇。 code
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後的內容經過管道傳遞給過濾工具。 htm
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 – 刪除文件中字符行上的某些區域
又要使用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命令變換咱們的文件行,以後咱們在再用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分析任務了,徹底不須要用腳本語言寫程序來處理它們。