溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Linux文本處理命令的編程技巧有哪些

發(fā)布時間:2021-11-02 10:52:16 來源:億速云 閱讀:109 作者:柒染 欄目:系統(tǒng)運(yùn)維

Linux文本處理命令的編程技巧有哪些,相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

合格的程序員都善于使用工具,正所謂君子性非異也,善假于物也。合理的利用 Linux 的命令行工具,可以提高我們的工作效率。

在前文的基礎(chǔ)上再介紹幾款有用的 Linux 命令行工具和使用場景。

再啰嗦幾句,工具能提供效率,但是有一定的學(xué)習(xí)曲線和學(xué)習(xí)成本。很多同學(xué)臨時想用時,可能會陷入了不會用的尷尬境地,再去網(wǎng)上搜索學(xué)習(xí),最終要花費(fèi)更長時間,還不如使用笨方法處理,這是很多同學(xué)不使用這些工具的原因之一。

而且更難的是,思維上改變原有的做事習(xí)慣,一個文件中有20多行數(shù)據(jù)要生成  SQL,好像用手工處理也就是1,2分鐘;快捷鍵記不住,我鼠標(biāo)移動一下點(diǎn)點(diǎn)也挺快。但是當(dāng)行數(shù)量變大或者復(fù)雜性提高時,這些手段的弊端就會顯現(xiàn),逼迫我們?nèi)ナ褂谜_的手段。

所以,為什么不一開始就使用更快,而且可以處理更加復(fù)雜場景的手段呢?

主要以兩個場景為引子,介紹 join、sort、uniq 命令和 sed 編輯器。

合并兩個文件中的關(guān)聯(lián)行

簡單說一下場景,有兩個文件,里邊都是固定格式的行,代表著數(shù)據(jù)庫的一行數(shù)據(jù),一個文件是用戶相關(guān)的數(shù)據(jù),有 user_id、username 和 gender  三列,另外一個文件是訂單相關(guān)的數(shù)據(jù),有order_id、price、user_id,time四行,現(xiàn)在要按照 user_id  將兩個文件按行合并,也就是user_id相同的行組合成一個新行,如下圖所示。

Linux文本處理命令的編程技巧有哪些

上述兩個文件的內(nèi)容如下所示:

// order.txt user_id是第三列 o1 1 u1 2011-9 o2 2 u2 2011-10 o3 3 u3 2011-10 o4 4 u1 2011-12 // user.txt user_id是第一列 u1 tom 男 u2 jack 男 u3 nacy 女

我們準(zhǔn)備使用 join,發(fā)現(xiàn)具體命令格式已經(jīng)忘記了。這時,既可以去網(wǎng)上搜尋,也可以去詢問 man

通過 man 你可以了解到 join 的功能描述和參數(shù)介紹,一般來說看 DESCRIPTION 一欄下的即可。

Linux文本處理命令的編程技巧有哪些

從上邊的 man 文檔可以很清楚的了解到 join 命令使用 equality join 操作對特定的文件進(jìn)行合并,并輸出到標(biāo)準(zhǔn)輸出流上。join  filed 就是用于合并文件時進(jìn)行比較的列,默認(rèn)是兩個文件的第一列。可以使用 -1 和 -2 分別制定第一個文件和第二個文件要對比的列。

$ join -1 3 -2 1 order.txt user.txt  # 指定以order.txt的第三列和user.txt的第一列來進(jìn)行對比join u1 o1 1 2011-9 tom 男 u2 o2 2 2011-10 jack 男 u3 o3 3 2011-10 nacy 女

會發(fā)現(xiàn),輸出中少了一行,order.txt 明明是四行,這是為什么呢?我們再來細(xì)看 man 文檔,發(fā)現(xiàn)了端倪。

Linux文本處理命令的編程技巧有哪些

兩個合并文件的行必須先按照對比列進(jìn)行排序,否則可能會導(dǎo)致缺失部分行。user.txt 已經(jīng)按照其第一列排序了,所以,我們只需要使用 sort 命令對  order.txt 按照其第三列進(jìn)行排序。

sort 命令將以默認(rèn)的方式將文本文件的第一列以ASCII 碼的次序排序,并將結(jié)果輸出到標(biāo)準(zhǔn)輸出。-k 參數(shù)可以指定其根據(jù)第幾列進(jìn)行排序。

$ sort -k 3 order.txt  # 按照數(shù)字排序則使用 -n 如果反序則用 -r o4 4 u1 2011-12 o1 1 u1 2011-9 o2 2 u2 2011-10 o3 3 u3 2011-10

我們將上述兩個命令結(jié)合起來使用,現(xiàn)將 sort 的結(jié)果存入 sorted_order.txt,然后再進(jìn)行 join,就能得到最終的結(jié)果。

$ sort -k 3 order.txt > sorted_order.txt $ join -1 3 -2 1 sorted_order.txt user.txt u1 o4 4 2011-12 tom 男 u1 o1 1 2011-9 tom 男 u2 o2 2 2011-10 jack 男 u3 o3 3 2011-10 nacy

另外,上述命令默認(rèn)的列分隔符都是\t和空格,可以使用 -t 參數(shù)來制定字符作為分隔符。

通過上述命令的組合,我們就完成了按照相同列合并兩個文件的操作,這也體現(xiàn)了 Linux 的 KISS 思想,每個工具只做一小件事情。

還是基于上述的場景,突然需要統(tǒng)計(jì)一下 order.txt 中每個用戶購買的訂單數(shù)量,然后按照訂單數(shù)進(jìn)行從大到小排序,這又該如何處理呢?

我們可以將 sort 和 uniq 兩個工具結(jié)合起來。uniq 命令一般用于檢查和刪除文件中重復(fù)出現(xiàn)的行,我們可以使用它來計(jì)算 order.txt  中用戶出現(xiàn)的次數(shù)。

$ sort -k 3 order.txt | uniq -f 3 -c  # -f 表示按照第三列進(jìn)行統(tǒng)計(jì)   1 o4 4 u1 2011-12   1 o1 1 u1 2011-9   2 o2 2 u2 2011-10

刪除 Markdown 文件中的超鏈接

另外一個場景是我編輯文章時遇到的,當(dāng)時 markdown  格式的文檔中有很多超鏈接,也就是[描述](鏈接)格式,希望全部把超鏈接去掉,也就是去掉方括號、圓括號和圓括號中的內(nèi)容。因?yàn)槲臋n中還有很多代碼,包含很多圓括號語句,所以必須先準(zhǔn)確超鏈接格式,然后再進(jìn)行替換。

這里,我們可以使用 sed 命令。sed 的全名叫 stream editor 流編輯器,可以使用程序的方式來編輯文本。想要全面學(xué)習(xí)它的小伙伴可以閱讀  《SED 簡明教程》或 《sed 手冊》,我們這里只介紹一下最基礎(chǔ)的功能,向大家展示使用它的可能性。使用 sed  一般要了解正則表達(dá)式,推薦《正則表達(dá)式30分鐘入門教程》。

sed 最簡單的使用方法就是替換文本。比如,我們要將上述的 order.txt 中的 u全部替換為user,則可以使用如下命令。

$ sed 's/u/user/g' order.txt  # u是被替換的詞 user是替換詞 o1 1 user1 2011-9 o2 2 user2 2011-10 o3 3 user3 2011-10 o4 4 user1 2011-12

sed 還能輕易實(shí)現(xiàn) sublime 或者 vscode 經(jīng)常使用的多行光標(biāo)編輯的功能。比如在 order.txt 的每行前頭前添加文字。

$ sed 's/^/#/g' order.txt   # ^在正則表達(dá)式中表示一行開頭,所以表示是在行開頭上加上#字符 #o1 1 u1 2011-9 #o2 2 u2 2011-10 #o3 3 u3 2011-10 #o4 4 u1 2011-12

下面,我們直接來看如何將超鏈接格式轉(zhuǎn)換為純文本。

$ echo "[鏈接](http://http://remcarpediem.net/)" | sed -E "s/\[(.*)]\(.*\)/\1/g" 鏈接

首先,識別[描述](鏈接) 格式的正則表達(dá)式是\[.*\]\(.*\),其中 \[和\( 分別表示匹配文本的[和( 符號。.  表示任何單個字符,*表示某個字符出現(xiàn)了0次或多次, 二者組合 .* 則表示出現(xiàn)0次或者多次任何字符。

綜上,上述正則表達(dá)的含義就是先出現(xiàn)一個[,再出現(xiàn)0次或者多次任意字符,在出現(xiàn)一個],在出現(xiàn)一個(,在出現(xiàn)0次或者多次任意字符,最后出現(xiàn)一個)。

其次,我們希望用[描述]中的描述文本來替換整個超鏈接文本,所以需要先識別出方括號中的內(nèi)容,則需要將其用()單獨(dú)括起來,表示一個子表達(dá)式,也就是\[(.*)\]\(.*\)。

最后,sed 的 s///g 模式下,s 表示替換模式,g 表示匹配每一行有行首到行尾的所有字符,加 g  則一行有多個鏈接可以匹配處理,不加只能匹配第一個。\1代表第一個子表達(dá)式,也就是方括號中的描述內(nèi)容。

看完上述內(nèi)容,你們掌握Linux文本處理命令的編程技巧有哪些的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI