Linux命令之文本處理(一),linux命令文本處理
wc命令
用來統計檔案的字元數、行數、單詞數等,很常用的命令(面試的時候竟然沒想起來這個命令,我是有多麼挫。。。)
使用格式為:wc options file-lists,若file-lists為空白或“-”,則表示從標準輸入讀入資料;options為空白的時候,預設輸出的資料依次是行數、單詞數、位元組數,如下:
m@meng:~$ wc examples.desktop 240 569 8980 examples.desktop
下面介紹各個選項:
- -c:只顯示位元組數,注意是位元組而不是字元,不同語言的一個字元佔據的位元組數是不同的,一個英文字母一般只佔一個位元組。
m@meng:~$ cat new a m@meng:~$ wc -c new 2 new
檔案new中只有一個字母a,但是統計結果卻是2個位元組,這是因為,wc把檔案末尾的分行符號也統計在內,這個分行符號也是挺有趣的,改天我會寫一篇文章分析一下。
m@meng:~$ cat new 你好 m@meng:~$ wc -c new 7 new m@meng:~$ wc -m new 3 new
算上分行符號,的確只有三個字元;但是佔用的位元組數卻是7,說明一個漢字佔用3個位元組。
m@meng:~$ cat new baa m@meng:~$ wc -L new 3 new
由此可見,行的長度不包含行尾換行。
- -w:顯示單詞數,準確的含義是: A word is a non-zero-length sequence of characters delimited by white space.
sort命令
看來排序是電腦的一個剛性需求,無論哪個領域似乎都需要排序。sort用來對檔案的行進行排序,輸出排好序的結果,不改變源檔案。
sort進行排序的單位是行,它會從每行的第一個字母開始比較,按照第一個字母的ASCII值從小到大排列行;若某兩行的第一個字母相同,則比較它們的第二個字母,以此類推。但是,這種排序會受到locale環境變數的影響,不一定出現想要的結果,如下:
m@meng:~$ cat new apple 3 Apple 7 pear 6 pear 4 banana 1 orange 8 m@meng:~$ sort new apple 3 Apple 7 banana 1 orange 8 pear 4 pear 6
按照ASCII的話,Apple應該排在第一行,但是它卻出現在第二行,這是因為當前的locale是zh_CN,修改後如下:
m@meng:~$ export LC_ALL=C m@meng:~$ sort new Apple 7 apple 3 banana 1 orange 8 pear 4 pear 6
注意,修改成en_US是不管用的,改成C是因為 manual中有句話“The locale specified by the environment affects sort order. Set LC_ALL=C to get the traditional sort order that uses native byte values”,現在按照想要的方式排序了。
- -t與-k選項
sort命令更強大或更常用的功能是對格式化的行進行排序,格式化是指每行由某個分隔字元分成了有規律的幾段,這樣以來就可以指定按照哪個段來排序,而不是像普通的排序那樣從每行的開頭逐個字元比較。如果每行的資料是不規律的,那麼按欄位排序是無效的。
-t用來指定分隔字元,-k用來指定哪個欄位,欄位從1開始計數。例如:
m@meng:~$ sort -t " " -k 2 new banana 1 apple 3 pear 4 pear 6 Apple 7 orange 8
預設的分隔字元是那些空白字元,如空格,tab等,對這些分隔字元可以省略-t,所以上面的-t ” “是多次一舉;分隔字元只能是單個字元,所以一般不用加引號。
可以指定多個-k選項,比如-k 2 -k 3,表示先按第二個欄位排序,當第二個欄位相同時,按第三個欄位排序。-k還有一些更複雜的用法,參見man。
- -n選項
按照數字大小排序。預設情況下,文本中的數字是被當做一般字元串的,而不是真正的數字。我們現在把文本中的orange數量改成11,沒有-n時如下:
m@meng:~$ sort new -k 2 banana 1 orange 11 apple 3 pear 4 pear 6 Apple 7
orange被排在第二行,這是典型的字串排序方式。加上-n之後,如下:
m@meng:~$ sort new -k 2 -n banana 1 apple 3 pear 4 pear 6 Apple 7 orange 11
- -r選項:反向排序。配合-k選項時,可以直接寫在欄位數後面。
- -o選項:相當於重新導向,指定輸出檔案,排序結果不再輸出到標準輸出,而是到指定的檔案中。
- -c選項:並不真正排序,只是檢查檔案是否已經排好序。
- -u選項:除去重複的行。有人認為也可以配合-k除去某欄位值相同的行,我實驗了一下,似乎不行,如下:
m@meng:~$ sort new -k 1 -u Apple 7 apple 3 banana 1 orange 11 pear 4 pear 6
看來要兩行完全相同才能除去。
- -d選項:只考慮字母和空白字元,其他字元自動忽略,如# $ %等。
- -f選項:忽略大小寫。
- -i選項:忽略非列印字元。
主要的就是這幾個選項了,以後遇到其他不錯的選項再補充。