共計 4559 個字符,預計需要花費 12 分鐘才能閱讀完成。
這篇文章主要介紹了每個程序員都應該知道的 Linux 命令有哪些,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓丸趣 TV 小編帶著大家一起了解一下。
讓我們從處理一些數據開始。假設我們有兩個文件,分別記錄的訂單清單和訂單處理結果。
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 ndash; 連接文件,并輸出結果
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 ndash; 文件里的文字按行排序
此時 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 ndash; 打印出匹配條件的文字行
假設我們只對 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 出了一些問題,你希望查看所有相關訂單 mdash; mdash; 你又需要使用 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 ndash; 刪除文件中字符行上的某些區域
又要使用 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 ndash; 一個流編輯器。它是用來在輸入流上執行基本的文本變換。
下面的例子展示了如何用 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
uniq ndash; 刪除重復的行
下面的例子展示了如何過濾出跟書相關的交易,刪除不需要的信息,獲得一個不重復的信息。
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 ndash; 在文件目錄中搜索文件
在上面的例子中我們處理了 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 ndash; 在文件里向前或向后移動
讓我們再回到簡單的 cat | sort 例子中來,下面的命令就是將經過合并、排序后的內容輸出到 less 命令里。在 less 命令,使用“/”來執行向前搜索,使用“?”命令執行向后搜索。搜索條件是一個正則表達式。
jfields$ cat order* | sort | less
如果你在 less 命令里使用 /113.*,所有 113 訂單的信息都會高亮。你也可以試試?.*112,所有跟訂單 112 相關的時間戳都會高亮。*** 你可以用 lsquo;q rsquo; 來退出 less 命令。
感謝你能夠認真閱讀完這篇文章,希望丸趣 TV 小編分享的“每個程序員都應該知道的 Linux 命令有哪些”這篇文章對大家有幫助,同時也希望大家多多支持丸趣 TV,關注丸趣 TV 行業資訊頻道,更多相關知識等著你來學習!