3-7:常见任务和主要工具之文本处理
文章目錄
- 一:復(fù)習(xí)cat,sort和uniq
- (1)cat-進(jìn)行文件拼接并且輸出到標(biāo)準(zhǔn)輸出
- (2)sort-對(duì)文本進(jìn)行排序
- (3)uniq-通知或省略重復(fù)的行
- 二:切片和切塊
- (1)cut-提取文本行中的部分內(nèi)容
- (2)paste-合并文本行
- (3)join-連接兩個(gè)文件中具有相同字段的行
- 三:文本比較
- (1)comm-逐行比較兩個(gè)已經(jīng)排序的文件
- (2)diff-逐行比較文件
- (3)patch-對(duì)原文件進(jìn)行diff操作
- 四:非交互式文本編輯
- (1)tr-替換和刪除字符
- (2)sed-文本過(guò)濾和轉(zhuǎn)換的流編輯器
- (3)aspell-交互式拼寫(xiě)檢查工具
本章使用到的命令有:
- cat:連接文件并打印到標(biāo)準(zhǔn)輸出
- sort:對(duì)文本進(jìn)行排序
- uniq:報(bào)告并省略重復(fù)行
- cut:從每一行中移除文本區(qū)域
- paste:合并文件文本行
- join:基于某個(gè)共享字段來(lái)聯(lián)合兩個(gè)文件的文本行
- comm:逐行比較兩個(gè)已經(jīng)排好序的文件
- diff:逐行比較文件
- patch:對(duì)原文件打補(bǔ)丁
- tr:轉(zhuǎn)換或刪除字符
- sed:用于過(guò)濾和轉(zhuǎn)換文本的流編輯器
- aspel:交互式拼寫(xiě)檢查器
一:復(fù)習(xí)cat,sort和uniq
這三個(gè)命令在之前的講述中我們就見(jiàn)到過(guò),現(xiàn)在要對(duì)它們做更深層次的理解
(1)cat-進(jìn)行文件拼接并且輸出到標(biāo)準(zhǔn)輸出
在第6章的講述中,我們說(shuō)過(guò)cat命令可以用來(lái)拼接文本。
cat命令可以提高文本內(nèi)容的可視化效果,比如說(shuō)他可以查看控制字符,比如說(shuō)制表符,我們知道控制字符屬于非打印字符
如下,根據(jù)之前的描述我們將輸入cat>test.txt,表示將標(biāo)準(zhǔn)輸入的內(nèi)容重定向到文件中,最后輸入Ctrl+D以告訴其輸入結(jié)束,輸入時(shí)特意在開(kāi)頭輸入制表符,在結(jié)尾輸入空格,然后使用cat -A選項(xiàng)查看這個(gè)文件,會(huì)發(fā)現(xiàn)非打印字符顯示在了屏幕上
其余選項(xiàng)如下
(2)sort-對(duì)文本進(jìn)行排序
sort是一個(gè)排序程序,它的操作對(duì)象為標(biāo)準(zhǔn)輸入或是命令行中指定的一個(gè)或多個(gè)文件,然后將結(jié)果發(fā)送至標(biāo)準(zhǔn)輸出,需要注意的是其排序的依據(jù)是每行的首字母
由于sort參數(shù)可以是多個(gè)文件,這就意味著它可以把多個(gè)文件按照字母順序進(jìn)行排序,并整合到一個(gè)文件中
sort的選項(xiàng)如下
其中sort-n需要注意一下,該參數(shù)的意思是根據(jù)數(shù)值進(jìn)行排序,還有-k選項(xiàng)可以根據(jù)一條記錄(你可以理解為每一行)的某個(gè)字段(你可以理解為某一列)進(jìn)行排序
舉個(gè)例子,ls命令默認(rèn)輸入結(jié)果是下面這樣子的,可以看出其排序時(shí)不是按照文件大小排序的
而如果輸入ls -l /usr/bin | sort -nr -k 5 |head,則表示排序時(shí)依據(jù)第5個(gè)字段采用降序排序
關(guān)于這個(gè)-k選項(xiàng)還是有必要和大家多討論討論,因?yàn)?k選項(xiàng)用處真的很大。如下列出了16條記錄,每條記錄第一個(gè)字段是Linux版本名,第二個(gè)字段是版本號(hào),第三個(gè)字段是發(fā)行時(shí)間
如果直接將其排序
可以發(fā)現(xiàn)排序的結(jié)果基本正確,但是同發(fā)行版本的版本號(hào)卻出現(xiàn)了一定錯(cuò)誤,比如10排在了其余數(shù)字前面。這說(shuō)明排序是有問(wèn)題的,類(lèi)比于Excel,大家還記得我們?cè)贓xcel中排序時(shí)也有一個(gè)主要關(guān)鍵字和次要關(guān)鍵字嗎,如果主要關(guān)鍵字時(shí)發(fā)行版本名字,那么次要關(guān)鍵字就是版本號(hào),也就是要在版本名字排序好之后再對(duì)同版本的進(jìn)行版本號(hào)的排序
而sort的-k選項(xiàng)也可以輸入多個(gè)排序參數(shù),每個(gè)參數(shù)可以是一個(gè)字段范圍,如果沒(méi)有指定字段范圍,sort會(huì)從改字段開(kāi)始直接覆蓋到末尾
所以我們可以輸入sort -k 1,1 -k 2n test.txt,其中-k 1,1表示開(kāi)始于第一個(gè)字段結(jié)束于第一個(gè)字段,-k 2n表示開(kāi)始于第2個(gè)字段,并且以數(shù)值的進(jìn)行排序
可以發(fā)現(xiàn)效果就比剛才好多了
如果要使用時(shí)間進(jìn)行排序呢,上圖中的這種格式的時(shí)間并不利用我們排序,但是-k選項(xiàng)中的參數(shù)偏移可以解決這個(gè)問(wèn)題
輸入sort -k 3.7nb -k 3.1nb -k3.4nb test.txt,表示主關(guān)鍵字排序?yàn)榈谌齻€(gè)字段偏移7位(年),二號(hào)關(guān)鍵字是第三個(gè)字段偏移1位(月),三號(hào)關(guān)鍵字是第三個(gè)字段偏移4位(日),然后注意添加b選項(xiàng),消除空格,防止排序錯(cuò)亂
有些記錄并不是按照空格分隔字段的,比如下面的/etc/passwd,它是按照冒號(hào)分隔字段的
幸運(yùn)的是,sort的-t選項(xiàng)可以讓我們自己指定分隔符
比如輸入sort -t ':' -k 3n /etc/passwd,表示對(duì)第三個(gè)字段進(jìn)行數(shù)值排序
(3)uniq-通知或省略重復(fù)的行
uniq前面咋們就了解過(guò),但是這里要強(qiáng)調(diào)的一點(diǎn)是uniq只能取出已經(jīng)排序好的文本中的重復(fù)的行,因?yàn)閡niq去除的是相鄰的重復(fù)行
其選項(xiàng)如下
二:切片和切塊
(1)cut-提取文本行中的部分內(nèi)容
cut命令用從文本行中提取一段文字并將其輸出至標(biāo)準(zhǔn)輸出
其選項(xiàng)如下
cut其實(shí)并不好去處理文件,因?yàn)槲募械膬?nèi)容字段的分隔有可能并不是特別規(guī)范,它特別適合處理一些命令的輸出結(jié)果
其中-d用于指定分隔符,-f用于提取第幾個(gè)字段的內(nèi)容,-c可以指定字段范圍并將其提取
以cat /etc/passwd為例
cat /etc/passwd | cut -d ':' -f 1,表示以冒號(hào)分割,查看第一個(gè)字段的內(nèi)容
cat /etc/passwd | cut -d ':' -f 1 | cut -c 1-3,表示截取上述結(jié)果的第1-3個(gè)字符
(2)paste-合并文本行
paste命令是cut的逆操作,它向文件中增加一個(gè)或是更多的文本列,該命令讀取多個(gè)文件并將每個(gè)文件中提取出的字段結(jié)合為一個(gè)整體的標(biāo)準(zhǔn)輸出流
舉例:首先我先講/etc/passwd重定向到了test中,這個(gè)文件中每條記錄有7個(gè)字段,cut -d ':' -f 1,2,3 test > 123表示將前3個(gè)字段截取放到文件123中
cut -d ‘:’ -f 4,5,6,7 test >4567也是這個(gè)道理
然后paste 4567 123 > 4567123表示將4567的內(nèi)容放在,123中的內(nèi)容放在后,然后全部合并至4567123中
(3)join-連接兩個(gè)文件中具有相同字段的行
簡(jiǎn)單來(lái)說(shuō)說(shuō)join命令用于合并兩個(gè)文件中具有公共字段的記錄
比如如下兩個(gè)文件中都有相同的公共字段,也就是姓名
然后使用join table1 table 2 > table3,就表示合并公共字段
三:文本比較
(1)comm-逐行比較兩個(gè)已經(jīng)排序的文件
comm命令用于文本文件的比較,顯示文件中相異的行以及相同的行
如下有兩個(gè)文件compare1 和compare2
然后輸入comm compare1 compare2
第一列會(huì)顯示文件1獨(dú)有的行,第二列會(huì)顯示文件2獨(dú)有的行,第三列會(huì)顯示他們相同的行
此外,comm還有-n選項(xiàng),表示輸入時(shí)忽略某幾兩列,比如comm -12 表示輸入他們相同的行
(2)diff-逐行比較文件
(3)patch-對(duì)原文件進(jìn)行diff操作
四:非交互式文本編輯
(1)tr-替換和刪除字符
tr命令可以對(duì)標(biāo)準(zhǔn)輸入進(jìn)行操作并且將結(jié)果以標(biāo)準(zhǔn)形式輸出
如下test中有小寫(xiě)和大寫(xiě)混合而成的文本
使用tr命令將其全部轉(zhuǎn)換為小寫(xiě)可以輸入:cat test | tr A-Z a-z | tee test
tr有兩個(gè)參數(shù)分別是被替換的和替換的字符集
字符集的表示方法可以有如下三種
- 枚舉:比如ABCDEFGHIJKLMNOPQRSTUVWXYZ
- 字符范圍(注意排序):比如a-z
- POSIX字符類(lèi):比如[:upper:]
一般情況下兩個(gè)字符集是等長(zhǎng)的,但是也可以不等長(zhǎng),比如
如果加上-d選項(xiàng)表示刪除字符集1中出現(xiàn)的字符
加上-s選項(xiàng)可以刪除標(biāo)準(zhǔn)輸入中相鄰的重復(fù)字符
(2)sed-文本過(guò)濾和轉(zhuǎn)換的流編輯器
sed是流式編輯器的縮寫(xiě),可以對(duì)文本流,指定文件集或標(biāo)準(zhǔn)輸入進(jìn)行文本編輯器,其功能非常強(qiáng)大
sed第一個(gè)引用就是替換,這一點(diǎn)和vim中替換有些相似
輸入cat test | se "s/aaaaa/ccccc/",表示把a(bǔ)替換為c
sed中多數(shù)命令可以在其前添加一個(gè)地址,該地址用來(lái)指定輸入流的哪一行被編輯
如果省略地址,則會(huì)對(duì)所有行進(jìn)行編輯
地址不僅可以用數(shù)字表示,而且還有如下眾多表示方法
其中s命令是sed中使用最為廣泛的參數(shù),
(3)aspell-交互式拼寫(xiě)檢查工具
總結(jié)
以上是生活随笔為你收集整理的3-7:常见任务和主要工具之文本处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Html5 dragdrop
- 下一篇: WebAPI性能优化之压缩解压