1. 程式人生 > >讓你的 Linux 命令騷起來

讓你的 Linux 命令騷起來

目錄

  • 管道符號 “ | ”
  • grep
  • sed
  • awk
  • sort
  • comm
  • uniq
  • tr
  • cat
  • head
  • tail
  • wc
  • find
  • tsort
  • tee
  • 「>」重定向符號
  • 「<」重定向符號
  • 混淆 Unicode 結果
  • 直接從資料庫管道
  • 總結

本文將為讀者提供許多不同 Linux 命令的簡要概述。 將特別強調解釋如何在執行資料科學任務的上下文中使用每個命令。 我們的目標是讓讀者相信這些命令中的每一個都非常有用,並且讓他們瞭解每個命令在操作或分析資料時可以扮演什麼角色。

管道符號 “ | ”

許多讀者可能已經熟悉了“ | ”符號,但是如果不熟悉的話,值得提前指出: 下面幾節中討論的命令的所有輸入和輸出都可以使用“ | ”符號自動“管道”輸入到彼此中! 這意味著每個命令完成的所有特殊任務都可以連結在一起,從而生成非常強大和簡短的迷你程式,所有這些都直接在命令列上完成!

grep

什麼是 grep? “ grep”是一個可用於從檔案中提取匹配文字的工具。 您可以指定許多不同的控制元件標誌和選項,這些標誌和選項允許您非常有選擇性地確定希望從檔案或流中提取哪些文字子集。 Grep 通常用作“面向行”的工具,這意味著在找到匹配的文字時,Grep 將列印該行上的所有文字,儘管您可以使用“-o”標誌只打印匹配的行部分。

為什麼 grep 是有用的? “ grep”很有用,因為它是在大量檔案中搜索特定文字塊的最快方法。 一些很好的用例有: 從巨大的 web 伺服器日誌中過濾訪問特定的 web 頁面; 為特定關鍵字的例項搜尋程式碼庫(這比使用 Eclipse Editor 的搜尋要快得多,也更可靠) ; 在 Unix 管道中過濾另一個命令的輸出。

Grep 與資料科學有什麼關係? Grep 對於特定的資料科學任務非常有用,因為它允許您非常快速地從資料集中篩選出所需的資訊。 很可能您的源資料中包含大量與您試圖回答的問題無關的資訊。 如果資料儲存在文字檔案中的單個行中,則可以使用 grep 只提取要處理的行,如果您能夠想到一個非常精確的搜尋規則來過濾它們的話。 例如,如果你有下面的。 Csv 檔案,每一行都有銷售記錄:

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

你可以使用這樣的命令:

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 

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

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 的檔案,其中包含了註冊你郵件的人的電子郵件地址:

[email protected]
[email protected]
[email protected]
[email protected]
[email protected]

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

[email protected]
[email protected]
[email protected]
[email protected]

對於這些檔案,您可能想知道三個不同問題的答案: 1)哪些使用者註冊併購買了產品? 2)哪些使用者註冊了時事通訊,但沒有轉換為購買? 3)哪些使用者進行了購買但沒有註冊訂閱時事通訊? 使用 comm 命令,您可以輕鬆地回答所有這三個問題。 這裡有一個命令,我們可以用來找到那些註冊了時事通訊並且購買了它的使用者:

comm -12 signups.txt purchases.txt 

結果如下:

[email protected] 
[email protected]

以下是我們如何找到那些註冊了時事通訊但沒有轉化的使用者:

comm -23 signups.txt purchases.txt

結果如下:

[email protected] 
[email protected] 
[email protected]

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

comm -13 signups.txt purchases.txt

結果如下:

[email protected] 
[email protected]

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」- 程式設計師匯聚地