讓你的 Linux 命令騷起來

本文將爲讀者提供許多不一樣 Linux 命令的簡要概述。 將特別強調解釋如何在執行數據科學任務的上下文中使用每一個命令。 咱們的目標是讓讀者相信這些命令中的每個都很是有用,而且讓他們瞭解每一個命令在操做或分析數據時能夠扮演什麼角色。mysql

管道符號 「 | 」

許多讀者可能已經熟悉了「 | 」符號,可是若是不熟悉的話,值得提早指出: 下面幾節中討論的命令的全部輸入和輸出均可以使用「 | 」符號自動「管道」輸入到彼此中! 這意味着每一個命令完成的全部特殊任務均可以連接在一塊兒,從而生成很是強大和簡短的迷你程序,全部這些都直接在命令行上完成!程序員

grep

什麼是 grep? 「 grep」是一個可用於從文件中提取匹配文本的工具。 您能夠指定許多不一樣的控件標誌和選項,這些標誌和選項容許您很是有選擇性地肯定但願從文件或流中提取哪些文本子集。 Grep 一般用做「面向行」的工具,這意味着在找到匹配的文本時,Grep 將打印該行上的全部文本,儘管您可使用「-o」標誌只打印匹配的行部分。web

爲何 grep 是有用的? 「 grep」頗有用,由於它是在大量文件中搜索特定文本塊的最快方法。 一些很好的用例有: 從巨大的 web 服務器日誌中過濾訪問特定的 web 頁面; 爲特定關鍵字的實例搜索代碼庫(這比使用 Eclipse Editor 的搜索要快得多,也更可靠) ; 在 Unix 管道中過濾另外一個命令的輸出。正則表達式

Grep 與數據科學有什麼關係? Grep 對於特定的數據科學任務很是有用,由於它容許您很是快速地從數據集中篩選出所需的信息。 極可能您的源數據中包含大量與您試圖回答的問題無關的信息。 若是數據存儲在文本文件中的單個行中,則可使用 grep 只提取要處理的行,若是您可以想到一個很是精確的搜索規則來過濾它們的話。 例如,若是你有下面的。 Csv 文件,每一行都有銷售記錄:sql

item, modelnumber, price, tax
Sneakers, MN009, 49.99, 1.11
Sneakers, MTG09, 139.99, 4.11
Shirt, MN089, 8.99, 1.44
Pants, N09, 39.99, 1.11
Sneakers, KN09, 49.99, 1.11
Shoes, BN009, 449.22, 4.31
Sneakers, dN099, 9.99, 1.22
Bananas, GG009, 4.99, 1.11

你可使用這樣的命令:shell

grep Sneakers sales.csv

只過濾掉包含文字「運動鞋」的銷售記錄。 下面是運行這個命令的結果:數據庫

Sneakers, MN009, 49.99, 1.11
Sneakers, MTG09, 139.99, 4.11
Sneakers, KN09, 49.99, 1.11
Sneakers, dN099, 9.99, 1.22

您還可使用帶有 grep 的複雜正則表達式來搜索包含某些模式的文本。 例如,這個命令將使用 grep 過濾掉全部以「 BN」或「 MN」開頭,後面至少跟有3個數字的型號:編程

grep -o "\(BN\|MN\)\([0-9]\)\{3\}" sales.csv

下面是運行這個命令的結果:bash

MN009
MN089
BN009

sed

什麼是 sed? Sed 是一個用於執行搜索和替換操做的工具。 例如,你可使用如下命令:

sed -i 's/dog/cat/g' *

將工做目錄中全部文件中的「 dog」替換爲「 cat」。

爲何 sed 有用? 「 sed」很是有用,由於您可使用正則表達式執行復雜的匹配和替換。 正則表達式替換還支持回溯引用,容許您匹配任意模式,而後以某種方式只更改匹配文本的一部分。 例如,這個 sed 命令將在任何給定行上查找兩個帶引號的字符串,而後在不更改文本的任何其餘部分的狀況下交換它們的位置。 它還同時將引號變成括號:

echo 'The "quick brown" fox jumped over the "lazy red" dog.' | sed -E 's/"([^"]+)"([^"]+)"([^"]+)"/(\3)\2(\1)/'

結果以下:

The (lazy red) fox jumped over the (quck brown) dog.

Sed 與數據科學有什麼關係? Sed 在數據科學中最大的用例是,若是您想使用它,那麼您的數據可能不徹底符合所需的格式。 例如,若是你的老闆給你一個文本文件 data.txt,其中包含數千個錯誤地用雙引號括起來的數字:

age,value
"33","5943"
"32","543"
"34","93"
"39","5943"
"36","9943"
"38","8943"

能夠經過如下 sed 命令運行該文件:

cat data.csv | sed 's/"//g'

取消全部任務,獲得如下結果:

age,value
33,5943
32,543
34,93
39,5943
36,9943
38,8943

若是您須要將數字導入到另外一個不能使用圍繞數字的引號的程序中,這將很是有用。 若是您曾經遇到過一些簡單的格式錯誤致使沒法導入或正確處理數據集的問題,那麼頗有可能有一個 sed 命令能夠修復您的問題。

awk

什麼是 awk? Awk 是一個能夠進行更高級搜索和替換可能須要通用計算的操做的工具。

爲何 awk 有用? Awk 頗有用,由於它基本上是一種通用編程語言,能夠輕鬆處理格式化的行文本。 與 sed 能夠作的事情有一些重疊,但 awk 要強大得多。 Awk 還能夠用於須要記住不一樣行之間的狀態的更改。

Awk 與數據科學有什麼關係? 假設你有一個包含溫度值的 CSV 文件 temps.CSV,可是文件中沒有使用攝氏溫度或華氏溫度,而是混合了這兩種溫度,表示攝氏溫度的單位爲 c,華氏溫度的單位爲 f:

temp,unit
26.1,C
78.1,F
23.1,C
25.7,C
76.3,F
77.3,F
24.2,C
79.3,F
27.9,C
75.1,F
25.9,C
79.0,F

你能夠用一個簡單的 awk 命令來完成這個任務:

cat temps.txt | awk -F',' '{if($2=="F")print (($1-32)*5/9)",C";else print $1","$2}'

結果將會是:

temp,unit
26.1,C
25.6111,C
23.1,C
25.7,C
24.6111,C
25.1667,C
24.2,C
26.2778,C
27.9,C
23.9444,C
25.9,C
26.1111,C

將全部溫度值標準化爲攝氏度。

sort

什麼是sort? sort的名字暴露了一切: 它是用來排序的!

爲何sort是有用的? 單獨進行排序並非頗有用,可是對於許多其餘任務來講,這是一個重要的先決條件: 想要找到最大 / 最小的? 只要把它們分類,而後拿走第一個或最後一個。 想要前十名嗎? 把它們分類,而後拿走最後的10個。 須要數字排序仍是字典排序? Sort 命令能夠二者兼顧! 讓咱們用幾種不一樣的方式來排序如下隨機文本 foo.txt 文件:

0 1 1234 11 ZZZZ 1010 0123 hello world abc123 Hello World 9 zzzz

下面是一個執行默認排序的命令:

cat foo.txt | sort

結果就是:

0
0123
1
1010
11
1234
9
abc123
Hello World
hello world
ZZZZ
zzzz

請注意,上面的排序是字典序,而不是數字順序,因此數字可能不是您指望的順序。 咱們能夠用數字排序來代替使用’-n’標誌:

cat foo.txt | sort -n

結果以下:

0
abc123
Hello World
hello world
ZZZZ
zzzz
1
9
11
0123
1010
1234

如今這些數字的順序是正確的。 另外一個常見的要求是按照相反的順序排序,你可使用’-r’標誌:

cat foo.txt | sort -r

結果以下:

zzzz ZZZZ hello world Hello World abc123 9 1234 11 1010 1 0123 0

排序和數據科學有什麼關係? 本文中其餘幾個與數據科學相關的 Linux 命令(comm、 uniq 等)要求您首先對輸入數據進行排序。 「排序」命令的另外一個有用的標誌是「-r」標誌,它將隨機從新排列輸入的行。 這對於爲其餘須要工做的軟件開發大量測試用例很是有用,無論文件中行的順序如何。

comm

什麼是comm? comm 是一個計算集合操做結果的工具: (聯合、交叉和補充)基於輸入文件中的文本行。

爲何comm是有用的? 若是您想了解兩個不一樣文件中常見或不一樣的行,Comm 很是有用。

comm與數據科學有什麼關係? 若是你有兩個電子郵件地址列表: 一個名爲 signups.txt 的文件,其中包含了註冊你郵件的人的電子郵件地址:

68_so_late@hotmail.com
fred@example.com
info@info.info
something@somewhere.com
ted@example.net

以及另外一個名爲 purchases.txt 的文件,其中包含購買你的產品的人的電子郵件地址:

example@gmail.com
fred@example.com
mark@facebook.com
something@somewhere.com

對於這些文件,您可能想知道三個不一樣問題的答案: 1)哪些用戶註冊併購買了產品? 2)哪些用戶註冊了時事通信,但沒有轉換爲購買? 3)哪些用戶進行了購買但沒有註冊訂閱時事通信? 使用 comm 命令,您能夠輕鬆地回答全部這三個問題。 這裏有一個命令,咱們能夠用來找到那些註冊了時事通信而且購買了它的用戶:

comm -12 signups.txt purchases.txt

結果以下:

fred@example.com 
something@somewhere.com

如下是咱們如何找到那些註冊了時事通信但沒有轉化的用戶:

comm -23 signups.txt purchases.txt

結果以下:

68_so_late@hotmail.com 
info@info.info 
ted@example.net

最後,這裏有一個指令,顯示了那些沒有對着時事通信唱歌就購買商品的人:

comm -13 signups.txt purchases.txt

結果以下:

example@gmail.com 
mark@facebook.com

Comm 命令要求傳遞給它的任何輸入首先進行排序。 一般,你的輸入文件不會被預先排序,可是你能夠在 bash 中使用如下語法直接使用 sort 命令將輸入傳遞給 comm,而不須要建立任何額外的文件:

comm -12 <(sort signups.txt) <(sort purchases.txt)

uniq

什麼是 uniq? 「 uniq」命令幫助您回答有關惟一性的問題。

爲何 uniq 有用? 若是您想要去除重複的行而且只輸出惟一的行,uniq 能夠作到這一點。 想知道每一個項目被複制了多少次? 優衣庫會告訴你的。 但願僅 * * 輸出重複的項目(例如,對應該是惟一的健全檢查輸入) ? 你也能夠這麼作。

Uniq 與數據科學有什麼關係? 假設你有一個名爲‘ sales.csv’的充滿銷售數據的文件:

Shoes,19.00
Shoes,28.00
Pants,77.00
Socks,12.00
Shirt,22.00
Socks,12.00
Socks,12.00
Boots,82.00

你須要一份數據集中全部獨特產品的簡明列表。 你只須要使用 awk 獲取產品並將結果導入 sort,而後使用 uniq:

cat sales.csv | awk -F',' '{print $1}' | sort | uniq

結果以下:

Boots 
Pants 
Shirt 
Shoes 
Socks

接下來你可能想知道的是每件獨一無二的商品賣出了多少:

cat sales.csv | awk -F',' '{print $1}' | sort | uniq -c

結果以下:

1 Boots
1 Pants
1 Shirt
2 Shoes
3 Socks

您還可使用帶 uniq 的’-d’標誌來獲取屢次出現的項目列表。 這在處理幾乎是惟一的列表時很是有用。

tr

什麼是 tr? Tr 命令是一個能夠移除或替換單個字符或字符集的工具。

爲何 tr 有用? 我發現使用 tr 命令最多見的緣由是刪除 Windows 機器上建立的文件中不須要的回車字符。 下面的例子說明了這一點,並將結果導入到 xxd 中,這樣咱們就能夠檢查十六進制:

echo -en "Hello\r" | tr -d "\r" | xxd

您還可使用‘ tr’命令進行其餘特殊狀況下的更正,這些更正可能須要在其餘一些 unix 管道中應用。 例如,有時可能會遇到使用空字符分隔代替換行的二進制數據。 可使用如下 tr 命令用換行代碼替換文件中的全部空字符:

echo -en "\0" | tr \\0 \\n | xxd

請注意,上面命令中的雙精度’’字符是必需的,由於 tr 指望「0」表示 null 字符,可是‘’自己須要在 shell 上進行轉義。 上面的命令顯示了輸入到 xxd 中的結果,這樣您就能夠驗證結果了。 在實際的用例中,您可能不但願在這個管道的末尾使用 xxd。

Tr 與數據科學有什麼關係? Tr 命令與數據科學的關係並不像這裏列出的其餘命令那樣深入,但它一般是特殊狀況下必不可少的補充,在處理數據的另外一個階段可能須要進行修復和清理。

cat

什麼是cat? Cat 命令是一個工具,您可使用它將文件鏈接在一塊兒並將其打印到 stdout。

爲何cat有用? 當您須要將多個文件縫合在一塊兒,或者須要將文件輸出到 stdout 時,cat 命令很是有用。

cat與數據科學有什麼關係? 在執行數據科學任務時,「 cat」命令的「 concating」特性確實會出現不少問題。 一個常見的狀況是,遇到多個 csv 文件,其中包含要聚合的格式相似的內容。 假設你有3個。 Csv 文件的電子郵件地址從時事通信註冊,購買,和購買列表。 您可能須要計算全部用戶數據的潛在影響範圍,所以須要計算全部3個文件中的獨立電子郵件數量。 你可使用 cat 把它們一塊兒打印出來,而後使用 sort 和 uniq 打印出一組獨特的電子郵件:

cat signups.csv purchases.csv purchased.csv | awk -F'\t' '{print $1}' | sort | uniq

極可能你已經習慣看到人們使用 cat 來讀取文件並將其導入到其餘程序中:

cat file.txt | somecommand

你也會偶爾看到人們指出這是 cat 的一個無用的用法,不是必須的,由於你能夠用這個語法來代替:

somecommand < file.txt

head

head是什麼? 「 head」命令只容許您打印文件的前幾行(或字節)。

爲何head是有用的? 若是您但願查看一個巨大(許多 GiB)文件的一小部分,或者您但願計算分析的另外一部分獲得的「 top 3」結果,那麼這是很是有用的。

head如何與數據科學聯繫起來? 假設您有一個文件「 sales.csv」 ,其中包含您所銷售產品的銷售數據列表:

Shoes,19.00
Shoes,19.00
Pants,77.00
Pants,77.00
Shoes,19.00
Shoes,28.00
Pants,77.00
Boots,22.00
Socks,12.00
Socks,12.00
Socks,12.00
Shirt,22.00
Socks,12.00
Boots,82.00
Boots,82.00

你可能想知道下面這個問題的答案: 「從最受歡迎到最不受歡迎的前三名產品是什麼? 」 . 你能夠用下面的管道來回答這個問題:

cat sales.csv | awk -F',' '{print $1}' | sort | uniq -c | sort -n -r | head -n 3

上面的 shell 管道將銷售數據輸入到 awk 中,而且只打印每行的第一列。 而後咱們對產品名稱進行排序(由於「 uniq」程序要求咱們對數據進行排序) ,而後使用「 uniq」來得到惟一產品的計數。 爲了對產品計數列表從最大到最小進行排序,咱們使用‘ sort-n-r’對產品計數進行數值排序。 而後,咱們能夠經過管道將完整的列表輸入到 head-n 3中,只能看到列表中的前三項:

4 Socks
4 Shoes
3 Pants

tail

什麼是tail? ‘ tail’命令是‘ head’命令的一個附屬命令,所以您能夠預期它的工做方式與‘ head’命令相似,只是它打印文件的結尾而不是開始。

爲何tail是有用的? ‘ tail’命令對於‘ head’命令有用的全部任務都頗有用。

tail和數據科學有什麼關係? 下面是一個例子,說明如何使用下面的命令來計算上一節中銷售數據的底部3個產品:

cat sales.csv | awk -F',' '{print $1}' | sort | uniq -c | sort -n -r | tail -n 3

結果就是:

3 Pants
 3 Boots
 1 Shirt

請注意,這可能不是您想要的演示格式,由於最低計數位於底部。 要查看輸出頂部的最低計數,你可使用‘ head’命令,而不須要倒序排序:

cat sales.csv | awk -F',' '{print $1}' | sort | uniq -c | sort -n | head -n 3

結果就是:

1 Shirt
3 Boots
3 Pants

Tail 命令的另外一個很好的用例是刪除文件的第一行。 例如,若是你有這樣的 CSV 數據:

product,price
Shoes,19.00
Shoes,28.00
Pants,77.00
Socks,12.00
Shirt,22.00

你試着用 awk 和 uniq 來計算不一樣的產品,以下所示:

cat sales.csv | awk -F',' '{print $1}' | sort | uniq -c

你最終會獲得以下輸出:

1 Pants
1 product
1 Shirt
2 Shoes
1 Socks

包含了頭部的「產品」這個詞,咱們並不想要這個詞。 咱們須要作的是修剪標題行,並開始只處理剩餘行上的數據(在咱們的例子中是第2行)。 咱們可使用‘ tail’命令,在輸出數據的行號(基於1的索引)前加上‘ + ’:

cat sales.csv | tail -n +2 | awk -F',' '{print $1}' | sort | uniq -c

如今咱們獲得了指望的結果與頭部省略:

1 Pants
1 Shirt
2 Shoes
1 Socks

wc

Wc 是什麼? Wc 命令是一個工具,您可使用它來獲取單詞計數和行計數。

爲何 wc 有用? 當您想要快速回答「有多少行? 」這個問題時,這個命令很是有用 或者這是多少個字符 .

Wc 與數據科學有什麼關係? 不少狀況下,不少快速問題能夠改成「這個文件有多少行? 」 想知道你的郵件列表中有多少封郵件嗎? 你可使用這個命令:

wc -l emails.csv

並可能從結果中減去一(若是文件中包含 csv 頭)。

若是你在工做目錄文件夾中有多個文件,你想要計算全部文件的行數(包括總行數) ,你可使用通配符:

wc -l *.csv

計算一段文本或一個文件中的字符數一般頗有用。 您甚至能夠將文本粘貼到 echo 語句中(使用-n 來避免換行符,由於換行符會使計數增長1) :

echo -n "Here is some text that you'll get a character count for" | wc -c

結果就是:

55

find

什麼是find? 「 find」命令可使用許多不一樣的選項搜索文件,它還能夠對每一個文件執行命令。

爲何find是有用的? Find 命令對於搜索給定多個不一樣選項(文件 / 目錄類型、文件大小、文件權限等)的文件很是有用,但它最有用的特性之一來自「-exec」選項,該選項容許您在找到文件後對其執行命令。

find與數據科學有什麼關係? 首先,讓咱們展現一個例子,說明如何使用 find 命令列出工做目錄文件夾中和下面的全部文件:

find .

正如您在上面的 wc 命令中看到的,您能夠計算工做目錄文件中全部文件的行數。 然而,若是你想對全部的文件、目錄和子目錄進行迭代來獲得每一個文件的總行數(例如在你的代碼庫中進行總行數) ,你可使用 find 來打印每一個文件的文本,而後經過管道將每一個文件的 * 聚合 * 輸出輸入到‘ wc’來獲得行數:

find . -type f -exec cat {} \; | wc -l

固然,您能夠經過更改‘ . ’來在除工做目錄目錄之外的其餘特定目錄上運行相似於上面的命令 成爲你想要的目錄。 只是要當心運行‘-exec’的 find,特別是若是你是做爲 root 用戶運行的話! 若是不當心對「 / 」目錄運行了錯誤的命令,可能會形成很大的損害。

tsort

什麼是tsort? 「 tsort」是一個能夠用來執行拓撲排序的工具。

爲何它是有用的? 「拓撲排序」是許多現實世界中的問題的解決方案,這些問題你可能天天都會遇到,卻沒有注意到。 一個很是著名的例子是提出一個時間表來完成一些任務,這些任務在上一個任務完成以前是不能開始的。 這樣的考慮是必要的在建築工程,由於你不能完成的工做,油漆牆,直到幹牆已經安裝。 你不能安裝幹牆,直到電力工做已經完成,你不能完成電力工做,直到牆壁框架已經完成等。 若是你只是在建房子,你也許能夠把這些都記在腦子裏,可是大型建築項目須要更多的自動化方法。 讓咱們在 task dependencies.txt 文件中回顧一個使用構造任務來構建房屋的示例:

wall_framing foundation
foundation excavation
excavation construction_permits
dry_wall electrical
electrical wall_framing
wall_painting crack_filling
crack_filling dry_wall

在上面的文件中,每一行由兩個「單詞」組成。 當「 tsort」命令處理文件時,它將假定第一個單詞描述了須要在第二個單詞以後出現的內容。 在處理完全部行以後,「 tsort」將按照大多數下游依賴項到最少的下游依賴項的順序輸出全部單詞。 如今讓咱們試一下:

cat task_dependencies.txt | tsort

結果以下:

wall_painting
crack_filling
dry_wall
electrical
wall_framing
foundation
excavation
construction_permits

您可能還記得上面的內容,您可使用帶有「 sort」命令的「-r」標誌來得到文件中行的隨機排序。 若是咱們在依賴項列表中重複「隨機」排序,並將其導入 tsort,你會發現結果老是相同的,儘管「 sort-r」的輸出每次都不一樣:

cat task_dependencies.txt | sort -R | tsort

這是由於即便咱們在這個文件中從新排列行,任務相互依賴的實際順序也不會改變。

這僅僅觸及了拓撲排序的一點皮毛,可是但願這能激起你足夠的興趣,讓你去查看維基百科關於拓撲排序的頁面

這和數據科學有什麼關係? 拓撲排序是一個基本的圖論問題,出如今不少地方: 機器學習; 物流; 調度; 項目管理等。

tee

Tee 是什麼? 「 tee」命令是一個工具,它容許您將流信息分離到一個文件中,同時還能夠將其打印到當前流的輸出中。

Tee 與數據科學的關係如何? 「 tee」命令實際上不會爲您作任何分析工做,可是若是您試圖調試爲何複雜的 shell 管道沒法工做,那麼它會很是有用。 讓咱們以上面的一個例子爲例,在管道的每一個階段之間放置對‘ tee’命令的引用:

cat sales.csv | tail -n +2 | tee after_tail.log | awk -F',' '{print $1}' | tee after_awk.log | sort | tee after_sort.log | uniq -c | tee after_uniq.log

如今,當您運行這個命令時,您將獲得4個文件,它們都顯示了流程中每一個階段的輸出是什麼樣的。 若是您但願可以返回並檢查經歷過罕見或複雜錯誤的 shell 管道,那麼這可能很是方便。 複雜的正則表達式一般用在這樣的管道中,有時候能夠匹配你不但願它們匹配的東西,因此使用這種方法你能夠很容易地得到更深刻的瞭解每個階段是怎麼回事。

「>」重定向符號

符號是一個輸出重定向符號,可用於重定向輸出。可用於重定向輸出文件,而不是將其打印到屏幕上。

cat sales.csv | tail -n +2 | awk -F',' '{print $1}' | sort | uniq -c > unique_counts.txt

「<」重定向符號

什麼是 < ? 符號是一個輸出重定向符號,它能夠將文件的內容指向程序的輸入。 這是上面討論的無用貓問題的替代方案:

grep Pants < sales.txt

混淆 Unicode 結果

最終會遇到的一個常見問題與混合不一樣的 Unicode 編碼有關。 特別值得注意的是,許多企業軟件提供商在進行編碼時會選擇 UTF-16而不是 UTF-8。 Csv 文件或數據庫轉儲。

例如,假設您但願經過一組文件對單詞‘ Hello’的全部實例進行 grep 處理。 首先,您能夠檢查文件包含的內容:

cat sometext.txt

你能夠看到它包含了 Hello 這個文本:

Hello World!

這怎麼可能發生? 當你查看十六進制文件時,答案變得更加清晰了:

xxd sometext.txt

給出以下輸出:

00000000: fffe 4800 6500 6c00 6c00 6f00 2000 5700  ..H.e.l.l.o. .W. 
00000010: 6f00 7200 6c00 6400 2100 0a00            o.r.l.d.!...

這裏發生的狀況是,文件‘ somefile.txt’以 UTF-16編碼,可是您的終端(可能)默認設置爲使用 UTF-8。 將 UTF-16編碼的文本中的字符打印到 UTF-8編碼的終端並無顯示出明顯的問題,由於 UTF-16空字符在終端上沒有獲得表示,可是其餘每一個奇數字節只是一個看起來與 UTF-8編碼相同的常規 ASCII 字符。

正如您在上面的輸出中看到的,這個文件並無使用 UTF-8對文件進行編碼,而是使用 UTF-16le。 沒有找到文本‘ Hello’ ,由於當您在命令行上爲‘ Hello’鍵入 grep 時,您鍵入的字符將在當前設置在終端環境(可能設置爲 UTF-8)的字符編碼文件中進行解釋。 所以,搜索字符串不包括這些 ASCII 字符後面額外的空字節,所以搜索失敗。 若是你想搜索 UTF-16字符,你可使用這個 grep 搜索:

grep -aP "H\x00e\x00l\x00l\x00o\x00" * sometext.txt

要打開二進制文件搜索,‘ a’標誌是必要的,由於 UTF-16中的空字符會致使文件被 grep 解釋爲二進制文件。 ‘ p’標誌指定 grep 模式應該被解釋爲一個 Perl 正則表達式,這將致使解釋‘ x’轉義。

iconv -f UTF-16 -t UTF-8 sometext.txt > sometext-utf-8.txt

如今你在處理這個文件時不須要採起任何特殊的步驟,由於這個編碼如今極可能與你的終端當前的編碼兼容:

00000000: 4865 6c6c 6f20 576f 726c 6421 0a         Hello World!.

直接從數據庫管道

若是你不能使用數據庫,你就算不上一個數據科學家。 幸運的是,大多數常見的數據庫應用程序都有一些直接從命令行運行即席查詢的機制。 請注意,這種作法很是粗糙,根本不推薦用於嚴肅的調查,而是用於得到快速、低保真的結果。 讓咱們從使用 Postgres SQL server 的示例開始。 假設您有一個名爲 url 的簡單數據庫表:

DROP TABLE urls;
CREATE TABLE urls (
  id serial NOT NULL PRIMARY KEY,
  url character varying(1000)
);
insert into urls (url) values ('http://example.com/');
insert into urls (url) values ('http://example.com/foo.html');
insert into urls (url) values ('http://example.org/index.html');
insert into urls (url) values ('http://google.ca/');
insert into urls (url) values ('http://google.ca/abc.html');
insert into urls (url) values ('https://google.ca/404.html');
insert into urls (url) values ('http://example.co.uk/');
insert into urls (url) values ('http://twitter.com/');
insert into urls (url) values ('http://blog.robertelder.org/');

您想要建立一個列表,顯示每一個域名在這個表中的 url 中是多麼常見。 您能夠經過建立一個命令來提取 url 數據(對於具備多列的相似查詢,可使用逗號) :

psql -d mydatascience -t -A -F"," -c "select url from urls;"

產生這樣的輸出:

http://example.com/
http://example.com/foo.html
http://example.org/index.html
http://google.ca/
http://google.ca/abc.html
https://google.ca/404.html
http://example.co.uk/
http://twitter.com/

如今,咱們能夠在這個管道上添加一個簡單的正則表達式,只選擇域名:

psql -d mydatascience -t -A -F"," -c "select url from urls;" | sed -E "s/^https?:\/\/([^\/]+).*/\1/"

下面是咱們正在研究的清單:

example.com
example.com
example.org
google.ca
google.ca
google.ca
example.co.uk
twitter.com

如今咱們可使用上面提到的 sort / uniq 技巧來得出最終的解決方案:

psql -d mydatascience -t -A -F"," -c "select url from urls;" | sed -E "s/^https?:\/\/([^\/]+).*/\1/" | sort | uniq -c | sort -n -r

Mysql 客戶端有一組相似的命令行選項,用於將數據提取到命令行:

mysql ... -s -r -N -e "select 1,2;"

固然,您可能認爲您最喜歡的查詢語言能夠直接在 SQL 命令行上做爲單個查詢來完成這些操做,可是這裏的要點是代表,若是須要,您能夠在命令行上完成這些操做。

總結

正如咱們在本文中所討論的,有許多 Linux 命令對於快速解決數據科學問題很是有用。 本文只爲每一個命令展現了幾個有用的標誌,但實際上還有幾十個。 但願,你的興趣已經足夠激起進一步研究他們。

若是你感興趣能夠關注公衆號「chasays」- 程序員匯聚地
在這裏插入圖片描述

相關文章
相關標籤/搜索