Linux之文字處理命令
Sort
將檔案的每一行作為一個單位,相互比較,比較原則是從首字元向後,依次按ASCII碼值進行比較,最後將他們按升序輸出。
-u 在輸出行中去除重複行
-r 改為降序(預設升序)
-o 將排序結果輸出到原檔案中(sort –r file.txt –o file.txt)
-n 以數值來排序(預設是以字元來排序,比如10比2小)
-t和-k 其中-t後面跟設定的間隔符,若為空格則用單引號將空格括起來,-k來指定列數(以哪一列來排序)
-f 將小寫字母都轉換為大寫字母來進行比較,亦即忽略大小寫
-c 檢查檔案是否排好序,如果亂序,則輸出第一個亂序的行的相關資訊,最後返回1
-C 檢查檔案是否排好序,如果亂序,不輸出內容,僅返回1
-M 以月份來排序
-b 忽略每一行前面的所有空白部分,從第一個可見字元開始比較
-I 表示忽略不可列印字元,只針對可列印字元(\a,\b,\n,\r都是不可列印字元)
-k:
可以寫多個 -k 數字,在前面的優先順序高,前面相同的就按後面的排序
-k 3r 表示第三個域按降序排序
-k 3nr 表示第三個域按降序以數值排序
如果將-n寫在最前面,那麼後面的域裡面不用寫n,都是按照以數值排序
-k 1.2 表示對第一個域的第二個字元開始到這個域的最後一個字元為止的字串進行排序
-k 1.2,1.2 表示只針對第一個域的第二個字元排序
-k 3,3 表示只對本域排序,若沒有後面那個3,則變成對第3個域開始到最後一個域位置的內容進行排
-k 1.1,1.1 –u 從第一個域的第一個字元開始,遇到相同的刪掉本身後面一個字元靠後的
-k 2 –k 1 –k 3 –u 只要有一個有不同就不會輕易刪除,-u會權衡所有-k選項,除非全部相同
Sort認為0小於00小於000小於0000…
-k 2.2,3.1 sort只會比較第二個域的第二個字元到第二個域的最後一個字元的部分,不會把第三個域的開頭字元納入比較範圍
Cut
三種定位:-b 位元組
-c 字元
-f 域
-b
Who|cut –b 3 提取第3個位元組
Who|cut –b 3-5,8 提取第3個,第4個,第5個,第8個位元組
其中cut –b 3-5,8與cut –b 8,3-5不同,所有定位會從小到大排序
-b -3表示從第一個位元組到第三個位元組,而-b 3-表示從第三個位元組到行尾,且都包括了第3個位元組
-b -3,3-表示輸出整行,不會出現連續兩個重疊的第3個位元組
-c
以字元為單位,可以輸出中文
-n用於告訴cut不要將多位元組字元拆開 -nb 1,2,3便可以輸出一個漢字
-f
cut –d : -f 1 以:為間隔符,提取第1個域
-f 3-5 提取第3個,第4個,第5個域
-f 4- 提取第4個域到最後一個域
Cut的-d選項的預設間隔符就是製表符,省略-d選項代表使用製表符,直接用-f來取域
-d ‘ ‘ 以空格為間隔符,兩個引號之間有空格
paste
將不同檔案的資料放在一行
格式:
Paste <-d><-s> file1 file2
-d 制定不同於空格或tab鍵的域分隔符。比如使用@分隔符,就可以[email protected]。d” ”
-s 將每個檔案合併成行,而不是按行合併(每個檔案中的內容佔一行)
- 使用標準輸入
cat a.txt
a
b
c
cat 1.txt
1
2
3
paste a.txt 1.txt
a1
b2
c3
paste –d @ a.txt 1.txt
paste –s a.txt 1.txt
abc
123
#ls
1.txt 2.txt
#ls | paste(預設是一個-,從標準輸入讀取一個作為一行)
1.txt
2.txt
#ls | paste –
1.txt
2.txt
#ls | paste - -(兩個-之間用空格分開,有多少個-,就取多少個作為一行)
1.txt2.txt
Tr
格式:
tr –c –d –s [“string1_to_translate_from”][“string2_to_translate_to”] < input-file
-c 用字串1中字符集的補集替換此字符集,要求字符集為ASCII
-d 刪除字串1中所有輸入字元
-s 刪除所有重複出現字元序列,只保留第一個;即將重複出現字串壓縮為一個字串
input-file 是轉換檔名
指定字串1或字串2的內容時,只能使用單字元或字串範圍或列表
[a-z]a-z內的字元組成的字串
[A-Z]A-Z內的字元組成的字串
[0-9]數字串
\octal 一個三位的八進位制數,對應有效的ASCII字元
[O*n] 表示字元O重複出現指定次數n。因此是匹配OO的字串
\a Ctrl-G 鈴聲\007
\b Ctrl-H 退格符\010
\f Ctrl-L 走行換頁\014
\n Ctrl-J 新行\012
\r Ctrl-M 回車\015
\t Ctrl-I tab鍵\011
\v Ctrl-X\ 030
應用例子
tr –s “[a-z]” <oops.txt > result.txt
去除oops.txt裡面的重複的小寫字元
tr –s “[\012]” < plan.txt 或 tr –s [“\n”] < plan.txt
刪除空行
tr –s “[\015]” “[\n]” < file 或 tr –s “[\r]” “[\n]” < file
刪除檔案中的^M,並代之以換行
cat a.txt |tr “[a-z]” “[A-Z]” > b.txt
大寫到小寫
tr –cs “[a-z][A-Z]” “[\012*]” <diary.txt
將檔案每行所有不包含在[a-z]或[A-Z]的字串放在字串1中並轉換為一新行。-s表示壓縮所有新行,-c表示保留所有字母不動
轉換控制字元
#cat –v stat.txt 顯示stat.txt的控制字元
box aa^^^^^12^M
apple bbas^^^^23^M
^Z
猜想‘^^^^^’是tab鍵,每一行以Ctrl-M結尾,檔案結尾Ctrl-Z
使用-s選項,檢視ASCII表。^的八進位制程式碼是136,^M是015,tab鍵是011,^Z是032
用tab鍵替換^^^^^,命令為”\136” “[\011*]”。將結果重定向到臨時工作檔案stat.tmp
tr –s “[\136]” “[\011*]” <stat.txt >stat.tmp
用新行替換每行末尾的^M,並用\n去除^Z,輸入要來自於臨時工作檔案stat.tmp
tr –s “[\015][\032]” “\n” <stat.tmp
要刪除所有的tab鍵,代之以空格,使用命令
tr –s “[\011]” “[\040*]” <input.file
tr –s “[:]” “[\011]” </etc/passwd或tr –s “[:]” “[\t]” </etc/passwd
替換passwd檔案中所有冒號,代之以tab鍵,可以增加可讀性
echo $PATH | tr “:” “\n”
將冒號改為回車
可以在vi裡面使用所有的命令,記住:在tr命令前要加上希望處理的行範圍和感嘆號(!),如1,$!tr –d ‘\t’(美元符號表示最後一行)
Tee
功能說明:讀取標準輸入的資料,並將其內容輸出成檔案
語法:tee [-ai] [--help] [--version] [檔案…]
補充說明:tee指令會從標準輸入裝置讀取資料,將其內容輸出到標準輸出裝置,同時儲存成檔案。可利用tee把管道匯入的資料存成檔案,甚至一次儲存數份檔案
引數:
-a 附加到既有檔案的後面,而非覆蓋它
-i 忽略中斷訊號
--help 線上幫助
--version 顯示版本資訊
範例:
#cat slayers.story |tee ss-copy1 ss-copy2 ss-copy3
列出文字檔案slayers.story的內容,同時複製3份副本,檔名稱分別為ss-copy1 ss-copy2 ss-copy3
tee file //覆蓋
tee –a file //追加
tee - //輸出到標準輸出兩次
tee - - //輸出到標準輸出三次
tee file1 file2 - //輸出到標準輸出兩次,並寫到那兩個檔案中
#tee testfile
生成一個檔案,包含你敲入的內容
#tee –i testfile
結果同testfile,不過不會接收中斷訊號,只能用Ctrl+d結束,不能用Ctrl+c
#ls | tee test
執行ls列出目錄檔案同時將輸出儲存到檔案test中
#ls “adfxaffewfasdf” 2>&1 | tee ls.txt
把標準錯誤輸出也儲存到檔案
Uniq
可以去除排序過的檔案中的重複行,因此uniq經常和sort何用。也就是說,為了使uniq起作用,所有的重複行必須是相鄰的,若有重複行卻沒在相鄰,那麼uniq不會刪除的
選項:
-c 可在每個輸出行之前加上該行重複的次數
-d 僅顯示重複的行
-u 顯示沒有重複的行
-i 忽略大小寫字元的不同
#cat testfile
hello
world
friend
hello
world
hello
#sort testfile | uniq –c
1 friend
3 hello
2 world
#sort testfile | uniq –dc
3 hello
2 world
#sort testfile | uniq –u
friend