排序文本sort 命令
用途:排序文件、對已排序的文件進行合併,並檢查文件以確定它們是否已排序。
語法:
sort [ -A ] [ -b ] [ -c ] [ -d ] [ -f ] [ -i ] [ -m] [ -n ] [ -r ] [ -u ] [ -o OutFile ] [ -t Character ] [ -T Directory ] [ -y [ Kilobytes ] ] [ -z RecordSize ] [ [ + [ FSkip ] [ .CSkip ] [ b ] [ d ] [ f ] [ i ] [ n ] [ r ] ] [ - [ FSkip ] [ .CSkip ] [ b ]
[ d ] [ f ] [ i ] [ n ] [ r ] ] ] ... [ -k KeyDefinition ] ... [ File ... ]
描述:
sort 命令對 File 參數指定的文件中的行排序,並將結果寫到標準輸出。如果 File 參數指定多個文件,那麼 sort 命令將這些文件連接起來,並當作一個文件進行排序。-(減號)代替文件名指定標準輸入。如果您不指定任何文件名,那麼該命令對標準輸入排序。可以使用 -o 標誌指定輸出文件。
如果不指定任何標誌,sort 命令基於當前語言環境的整理順序對輸入文件的所有行排序。
排序關鍵字
參數描述:
例子:# sort -t : -k 3 /etc/passwd 根據/etc/passwd文件中的第三列來將passwd文件進行排序後輸出
-d會忽略%
- 要在
LC_ALL、LC_COLLATE 或 LANG 環境變量設置爲En_US 的情況下排序fruits 文件,請輸入:
LANG=En_US sort fruits
此命令序列顯示以升序詞典順序排序的 fruits 文件的內容。每一列的字符,包括空格、數字和特殊字符都經一一比較。例如,如果fruits 文件包含文本:
banana orange Persimmon apple %%banana apple ORANGE
sort 命令顯示:
%%banana ORANGE Persimmon apple apple banana orange
在 ASCII 整理序列中,%(百分號)在大寫字母前,大寫字母在小寫字母前。如果您當前的語言環境指定 ASCII 之外的字符集,結果可能不同。
- 要以字典順序排序,請輸入:
sort -d fruits此命令序列排序和顯示 fruits 文件的內容,並且只比較字母、數字和空格。如果 fruits 文件與示例 1 相同,那麼 sort 命令顯示:
ORANGE Persimmon apple apple %%banana banana orange
-d 標誌忽略 %(百分號)字符,因爲它不是個字母、數字或空格。(即%%banana 被banana 取代)。
- 要將包含大寫字母和具有類似小寫行的特殊字符行分組,請輸入:
-d 標誌忽略特殊字符,-f 標誌忽略大小寫差異。將
LC_ALL、LC_COLLATE 或 LANG 環境變量設置爲C 的情況下,fruits 文件的輸出結果變爲:
apple apple %%banana banana ORANGE orange Persimmon
- 要除去重複行排序,請輸入:
-u 標誌告訴 sort 命令除去重複的行,使文件中的每一行唯一。此命令序列顯示:
apple %%banana orange Persimmon
不僅除去重複的 apple,而且也除去了 banana 和 ORANGE。除去這些是因爲-d 標誌忽略%% 這個特殊字符,-f 標誌忽略大小寫差異。
- 要如例 4 那樣排序,除去重複的實例(除非是大寫字母或標點不同),請輸入:
輸入 +0 -d -f 完成的排序與示例 3 中 -d -f 的排序類型相同,+0 進行另一項比較以區分不一樣的行。這防止-u 標誌將它們除去。
示例 1 所示的 fruits 文件中,添加的 +0 將 %%banana 與banana 及ORANGE 與 orange 區分開來。然而,apple 的兩個實例是相同的,所以其中之一被刪除。
apple %%banana banana ORANGE orange Persimmon
- 要指定分隔字段的字符,請輸入:
sort -t: +1 vegetables此命令序列排序 vegetables 文件,對每一行上第一個冒號後的文本進行比較。+1 告訴 sort 命令忽略第一字段,從第二字段的開始到該行的結束進行比較。-t: 標誌告訴 sort 命令冒號分隔字段。如果vegetables 包含:
yams:104 turnips:8 potatoes:15 carrots:104 green beans:32 radishes:5 lettuce:15
那麼,將 LC_ALL、LC_COLLATE 或LANG 環境變量設置爲 C 的情況下,sort 命令將顯示:
carrots:104 yams:104 lettuce:15 potatoes:15 green beans:32 radishes:5 turnips:8
注意數字沒有按照數字排序。當用字典式分類從左至右比較每一個字符時出現這種情況。換句話說,3 在5 之前,所以32 在 5 之前。
- 要排序數字,請輸入:
此命令序列按照第二個字段對 vegetables 文件進行數字排序。如果 vegetables 文件與示例 6 中的相同,那麼sort 命令將顯示:
radishes:5 turnips:8 lettuce:15 potatoes:15 green beans:32 carrots:104 yams:104
- 要對多個字段排序,請輸入:
或
此命令序列對第二字段(+1 -2 -n)進行數字排序。在這個順序中,它以逆字母順序(+0 -1 -r)對第一字段排序。將
LC_ALL、LC_COLLATE 或 LANG 環境變量設置爲 C 的情況下,輸出將類似於:
radishes:5 turnips:8 potatoes:15 lettuce:15 green beans:32 yams:104 carrots:104
此命令按數字順序對行排序。當兩行數字相同時,它們以逆字母順序出現。
- 要使用排序的文本替換原始文件,請輸入:
sort -o vegetables vegetables此命令序列將排序輸出存入 vegetables 文件( -o vegetables)。
uniq命令-----文本除重
文件經過處理後在它的輸出文件中可能會出現重複的行。例如,使用cat命令將兩個文件合併後,再使用sort命令進行排序,就可能出現重複行。這時可以使用uniq命令將這些重複行從輸出文件中刪除,只留下每條記錄的唯一樣本。
語法:
uniq [選項] 文件
說明:這個命令讀取輸入文件,並比較相鄰的行。在正常情況下,第二個及以後更多個重複行將被刪去,行比較是根據所用字符集的排序序列進行的。該命令加工後的結果寫到輸出文件中。輸入文件和輸出文件必須不同。如果輸入文件用“- ”表示,則從標準輸入讀取。
-c或--count 在每列旁邊顯示該行重複出現的次數。
-d或--repeated 僅顯示重複出現的行列。
-f<欄位>或--skip-fields=<欄位> 忽略比較指定的欄位。
-s<字符位置>或--skip-chars=<字符位置> 忽略比較指定的字符。
-u或--unique 僅顯示出一次的行列。
-w<字符位置>或--check-chars=<字符位置> 指定要比較的字符。
--help 顯示幫助。
--version 顯示版本信息。
例子:
[root@stu100 ~]#
cat test
boy took bat home
boy took bat home
girl took bat home
dog brought hat home
dog brought hat home
dog brought hat home
看test文件的內容,可以看到其中的連續重複行
[root@stu100 ~]# uniq test
boy took bat home
girl took bat home
dog brought hat home
uniq命令不加任何參數,僅顯示連續重複的行一次
[root@stu100 ~]# uniq -c test
2 boy took bat home
1 girl took bat home
3 dog brought hat home
-c 參數顯示文件中每行連續出現的次數。
[root@stu100 ~]# uniq -d test
boy took bat home
dog brought hat home
-d選項僅顯示文件中連續重複出現的行。
[root@stu100 ~]# uniq -u test
girl took bat home
-u選項顯示文件中沒有連續出現的行。
[root@stu100 ~]# uniq -f 2 -s 2 test
boy took bat home
忽略每行的前2個字段,忽略第二個空白字符和第三個字段的首字符,結果at home
[root@stu100 ~]# uniq -f 1 test
boy took bat home
dog brought hat home
忽略每行的第一個字段,這樣boy ,girl開頭的行看起來是連續重複的行
文件的打印和格式化輸出
文件打印---pr命令
pr是一個標準的輸出工具,可以直接輸出到打印機,如果你希望將結果保存在文件中,則需要重定向它的輸出,如下面這個例子:
$ pr file.txt file.output
可以用來控制文本輸出效果的參數很多,一般來說,每頁的標題就是這個文檔的文件名。當然,用戶也可以自行定義標題,比如:
$ pr -h "My report" file.txt
使用fmt命令格式化文本
語 法:fmt [-cstu][-p<列起始字符串>][-w<每列字符數>][--help][--version][文件...]
參 數:
-c或–crown-margin 每段前兩列縮排。
-p<列起始字符串>或-prefix=<列起始字符串> 僅合併含有指定字符串的列,通常運用在程序語言的註解方面。
-s或–split-only 只拆開字數超出每列字符數的列,但不合並字數不足每列字符數的列。
-t或–tagged-paragraph 每列前兩列縮排,但第1列和第2列的縮排格式不同。
-u或–uniform-spacing 每個字符之間都以一個空格字符間隔,每個句子之間則兩個空格字符分隔。
-w<每列字符數>或–width=<每列字符數>或-<每列字符數> 設置每列的最大字符數。
文本的提取
cut命令
cut命令可以從一個文本文件或者文本流中提取文本列。
cut [選項]… [文件]…
選項說明:
-b, –bytes=LIST 以字節爲單位取出固定字節區間
-c, –characters=LIST 以字符爲單位取出固定字符區間
-d, –delimiter=DELIM 指定分隔符來代替默認的TAB分隔符
-f, –fields=LIST 依據 -d 指定的分隔符將一段內容分割成爲數段,用 -f 取出第幾段的意思
-n with -b: 不分隔多字節字符
–complement 補充選定的字節,字符集或字段
-s, –only-delimited 不打印不包含分隔符的行
–output-delimiter=STRING 使用String 作爲輸出分隔符,默認的是使用輸入分隔符
僅使用f -b, -c 或-f 中的一個。每一個列表都是專門爲一個類別作出的,或者您可以用逗號隔 開要同時顯示的不同類別。您的輸入順序將作爲讀取順序,每個僅能輸入一次。 每種參數格式表示範圍如下: N 從第1 個開始數的第N 個字節、字符或域 N- 從第N 個開始到所在行結束的所有字符、字節或域 N-M 從第N 個開始到第M 個之間(包括第M 個)的所有字符、字節或域 -M 從第1 個開始到第M 個之間(包括第M 個)的所有字符、字節或域例子:
1,測試文件
[zhangy@BlackGhost comte]$ cat test
test:x:1003:1003::/home/test:/bin/bash
張ying:x:1004:1004::/home/test:/bin/bash
policykit:x:102:1005:PolicyKit:/:/sbin/nologin
postfix:x:73:73::/var/spool/postfix:/bin/false
上面是/etc/passwd文件中的一部分,加了點中文在裏面
2,-b和-c的用法
[zhangy@BlackGhost comte]$ cut -b 1-10 test //取得文件中第1個字節到第10個字節的內容
test:x:100
張ying:x:
policykit:
postfix:x:
[zhangy@BlackGhost comte]$ cut -b 1,4,5,7,10 test //取文件中第1,4,5,7,10字節的內容
tt::0
�yig: //爲什麼會出現亂碼嗎,因爲漢字所佔字節數大於1,分開的話,肯定會顯示錯誤的
pick:
ptfx:
-c的用法根-b差不多,只不過一個截取時是字節爲單位,一個是以字符爲單位
3,-d和-f的用法
[zhangy@BlackGhost comte]$ cut -f 1 test //不分割都顯示出來
test:x:1003:1003::/home/test:/bin/bash
張ying:x:1004:1004::/home/test:/bin/bash
policykit:x:102:1005:PolicyKit:/:/sbin/nologin
postfix:x:73:73::/var/spool/postfix:/bin/false
[zhangy@BlackGhost comte]$ cut -d : -f1 test //分割了顯示分割後的第一個域
test
張ying
policykit
postfix
-d後面根的冒號是分割文件行的的分割符,-d一般情況下根-f一起使用,而不能和-b,-c一起使用
4,-s的用法
[zhangy@BlackGhost comte]$ cut -d : -f 1-5 -s --output-delimiter="|" test
test|x|1003|1003|
張ying|x|1004|1004|
policykit|x|102|1005|PolicyKit
postfix|x|73|73|
-s起到了輸出控制的作用。
使用join連接字段
join 命令
功能說明:將兩個文件中,指定欄位內容相同的行連接起來。
語 法:join [-i][-a<1或2>][-e<字符串>][-o<格式>][-t<字符>][-v<1或2>][-1<欄位>][-2<欄位>][--help][--version][文件1][文件2]
補充說明:找出兩個文件中,指定欄位內容相同的行,並加以合併,再輸出到標準輸出設備。
參 數:
-a<1或2> 除了顯示原來的輸出內容之外,還顯示指令文件中沒有相同欄位的行。
-e<字符串> 若[文件1]與[文件2]中找不到指定的欄位,則在輸出中填入選項中的字符串。
-i或--igore-case 比較欄位內容時,忽略大小寫的差異。
-o<格式> 按照指定的格式來顯示結果。
-t<字符> 使用欄位的分隔字符。
-v<1或2> 跟-a相同,但是隻顯示文件中沒有相同欄位的行。
-1<欄位> 連接[文件1]指定的欄位。
-2<欄位> 連接[文件2]指定的欄位。
join類似 db裏面的join方法,同樣有left join right join inner join等
指定參數-a 可以指定join的方式。 -a1表示 顯示第一個文件中不匹配的行,即爲left join
-a2 表示 顯示第二個文件中不匹配的行,即爲right join
使用示例:
$ cat employee.txt 100 Jason Smith 200 John Doe 300 Sanjay Gupta 400 Ashok Sharma $ cat bonus.txt 100 $5,000 200 $500 300 $3,000 400 $1,250 $ join employee.txt bonus.txt 100 Jason Smith $5,000 200 John Doe $500 300 Sanjay Gupta $3,000 400 Ashok Sharma $1,250