第十三章 对文本进行排序、单一和重复操作:sort命令、uniq命令
第十三章 對文本進行排序、單一和重復操作:sort命令、uniq命令
sort命令
名字解釋
sort命令 它將文件進行排序,并將排序結果標準輸出。sort命令即可以從特定的文件,也可以從stdin中獲取輸入。
語法
sort (選項) (參數)選項
- -b:忽略每行前面開始出的空格字符;
- -c:檢查文件是否已經按照順序排;
- -d:排序時,處理英文字母、數字及空格字符外,忽略其他的字符;
- -f:排序時,將小寫字母視為大寫字母;
- -i:排序時,除了040-176之間的ASCII字符外,忽略其他的字符;
- -m:將幾個排序號的文件進行合并;
- -M:將前面3個字母依照月份的縮寫進行排序;
- -n:依照數值的大小排序;
- -o:將排序后的結果存入指定的文件;
- -r:以相反的順序來排序;
- -t:指定排序時所用的欄位分隔字符;
- +<起始欄位>-<結束欄位>:以指定的欄位來排序,范圍由起始欄位到結束欄位的前一欄位。
- -u或--unique:跟-c意思是類似,但是不打印相同的行。
參數
文件:指定待排序的文件列表。
實例
sort將文件/文本的每一行作為一個單位,相互比較,比較原則是從首字符向后,一次按照ASCII碼值進行比較,最后將他們按升序輸出。
[root@ceshi ~]# cat sort.txt aaa:10:1.1 ccc:30:3.3 ddd:40:4.4 bbb:20:2.2 eee:50:5.5 eee:50:5.5排序后: [root@ceshi ~]# sort sort.txt aaa:10:1.1 bbb:20:2.2 ccc:30:3.3 ddd:40:4.4 eee:50:5.5 eee:50:5.5忽略相同的行
排序 忽略相同的行: [root@ceshi ~]# sort -u sort.txt aaa:10:1.1 bbb:20:2.2 ccc:30:3.3 ddd:40:4.4 eee:50:5.5 或者 [root@ceshi ~]# uniq sort.txt aaa:10:1.1 ccc:30:3.3 ddd:40:4.4 bbb:20:2.2 eee:50:5.5sort的-n、-r、-k、-t選項的使用:
-n:是按照數字大小排序,
-r是以相反順序,
-k是指定需要排序的欄位,
-t指定欄位分隔符為冒號
[root@ceshi ~]# cat sort2.txt AAA:BB:CC aaa:30:1.6 ccc:50:3.3 ddd:20:4.2 bbb:10:2.5 eee:40:5.4 eee:60:5.1#將BB列按照數字從小到大順序排列: [root@ceshi ~]# sort -nk 2 -t: sort2.txt AAA:BB:CC bbb:10:2.5 ddd:20:4.2 aaa:30:1.6 eee:40:5.4 ccc:50:3.3 eee:60:5.1#將CC列數字從大到小順序排列 [root@ceshi ~]# sort -nk 3 -t: sort2.txt AAA:BB:CC aaa:30:1.6 bbb:10:2.5 ccc:50:3.3 ddd:20:4.2 eee:60:5.1 eee:40:5.4#-n:是按照數字大小排序,-r是以相反順序,-k是指定需要排序的欄位,-t指定欄位分隔符為冒號-k選項的具體語法格式:
FStart.CStart Modifie,FEnd.CEnd Modifier -------Start--------,-------End--------FStart.CStart 選項 , FEnd.CEnd 選項這個語法格式可以被其中的逗號,分為兩大部分,Start部分和End部分。Start部分也由三部分組成,其中的Modifier部分就是我們之前說過的類似n和r的選項部分。我們重點說說Start部分的FStart和C.Start。C.Start也是可以省略的,省略的話就表示從本域的開頭部分開始。FStart.CStart,其中FStart就是表示使用的域,而CStart則表示在FStart域中從第幾個字符開始算“排序首字符”。同理,在End部分中,你可以設定FEnd.CEnd,如果你省略.CEnd,則表示結尾到“域尾”,即本域的最后一個字符。或者,如果你將CEnd設定為0(零),也是表示結尾到“域尾”。
例子:從公司英文名稱的第二個字母開始進行排序
[root@ceshi ~]# cat company.txt sohu 100 3000 google 100 4000 baidu 105 3000 guge 105 2500#從公司英文名稱的第二個字母開始進行排序 [root@ceshi ~]# sort -t ' ' -k 1.2 company.txt baidu 105 3000 sohu 100 3000 google 100 4000 guge 105 2500 #從公司英文名稱的第三個字母開始進行排序 [root@ceshi ~]# sort -t ' ' -k 1.3 company.txt guge 105 2500 sohu 100 3000 baidu 105 3000 google 100 4000第1個域 第2個域 第3個域使用-k 1.2 ,表示對第1個域的第2個字符進行公司名字的排序。
只針對公司英文名稱的第2個字母進行排序,如果有相同的就按照工資進行降序排序:
[root@ceshi ~]# sort -t ' ' -k 1.2,1.2 -nrk 3,3 company.txt google 100 4000 sohu 100 3000 baidu 105 3000 guge 105 2500-k 1.2,1.2 代表只針對第2個字母進行排序。如果寫成-k 1.2那,就意味著將對從第2個字母起到本域最后一個字符為止的字符串進行排序。
-k 3,3 代表只針對第3個域進行排序。如果寫成-k 3那,就意味著將對從第3個域開始字母起到本域最后一個字符為止的字符串進行排序。
uniq命令
名字解釋
uniq命令 用于報告或忽略文件中的重復行,一般與sort命令結合使用。
語法
uniq (選項) (參數)選項
- -c或--count:在每列旁邊顯示該行重復出現的次數;
- -d或--repeated:僅顯示重復出現的行列;
- -f<欄位>或--skip-fields=<欄位>:忽略比較指定的字符;
- -s<字符位置>或--skip-chars=<字符為止>:忽略比較指定的字符;
- -u或--unique:僅顯示出一次的行列;
- -w<字符位置>或--check-chars=<字符位置>:指定要比較的字符。
參數
輸入文件:指定要去除的重復行文件。如果不指定選項,則從標準讀取數據;
輸出文件:指定要去除重復行后的內容要寫入的輸出文件。如果不指定選項,則將內容顯示到標準輸出設備。
實例
刪除重復行:
[root@ceshi ~]# cat repeat.txt aaaaaaaaaaaa aaaaaaaaaaaa bbbbbbbbbbbbbb bbbbbbbbbb cccccccccccccc cccccccc dddddddddddd dddddddddddd#方法一: [root@ceshi ~]# uniq repeat.txt aaaaaaaaaaaa bbbbbbbbbbbbbb bbbbbbbbbb cccccccccccccc cccccccc dddddddddddd #方法二: [root@ceshi ~]# sort repeat.txt | uniq aaaaaaaaaaaa bbbbbbbbbb bbbbbbbbbbbbbb cccccccc cccccccccccccc dddddddddddd #方法三: [root@ceshi ~]# sort -u repeat.txt aaaaaaaaaaaa bbbbbbbbbb bbbbbbbbbbbbbb cccccccc cccccccccccccc dddddddddddd只顯示單一行
#方法一: [root@ceshi ~]# uniq -u repeat.txt bbbbbbbbbbbbbb bbbbbbbbbb cccccccccccccc cccccccc#方法二: [root@ceshi ~]# sort repeat.txt | uniq -u bbbbbbbbbb bbbbbbbbbbbbbb cccccccc cccccccccccccc統計各行在文件中出現的次數:
[root@ceshi ~]# sort repeat.txt | uniq -c2 aaaaaaaaaaaa1 bbbbbbbbbb1 bbbbbbbbbbbbbb1 cccccccc1 cccccccccccccc2 dddddddddddd在文件中找出重復的行:
[root@ceshi ~]# sort repeat.txt | uniq -d aaaaaaaaaaaa dddddddddddd實踐例子:統計當天httpd訪問日志,次數最多的前5個ip
日志格式如下:
[root@z1 httpd]# head -2 access_log139.162.88.63 - - [05/Aug/2018:03:26:26 +0800] "GET http://clientapi.ipip.net/echo.php?info=1234567890 HTTP/1.1" 404 206 "-" "Go-http-client/1.1" 78.129.130.54 - - [05/Aug/2018:03:44:39 +0800] "GET /xmlrpc.php HTTP/1.1" 404 208 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6"實施命令:
cat access_log | grep "06/Aug/2018" | awk '{ print $1 }' | uniq -c | sort -r | head -5解決思路:
1、需要先用grep 過濾當天的日志信息
2、然后使用awk 只打印ip 參數出來
3、使用uniq -c 統計ip重復出現的次數
4、使用sort -r 進行相反順序排序
5、使用head -5 只打印前5行內容
查詢結果:
[root@z1 httpd]# cat access_log | grep "06/Aug/2018" | awk '{ print $1 }' | uniq -c | sort -r | head -58 93.80.161.2462 68.56.29.1002 60.191.52.2542 41.233.148.1182 201.238.154.10轉載于:https://blog.51cto.com/506554897/2118604
總結
以上是生活随笔為你收集整理的第十三章 对文本进行排序、单一和重复操作:sort命令、uniq命令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新建maven的pom.xml第一行出错
- 下一篇: 【每天一个JQuery特效】淡入淡出显示