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