Linux基礎入門(五)--學習筆記-歷史命令

介紹

在linux中,對於文本的處理和分析是極爲重要的,現在有一個文件叫做data1,同學們可以在這裏下載,

wget http://labfile.oss.aliyuncs.com/courses/1/data1

裏面記錄是一些命令的記錄,現在需要你從裏面找出出現頻率次數前3的命令並保存在/home/shiyanlou/result。

目標

處理文本data
將結果寫入result
結果包含次數和命令,如“100 ls”
提示

cut截取(-c 8- 明白含義嗎)
uniq -dc去重
sort 的參數選擇-k1 -n -r
答案類似於

cat data|....|....|....   >  /home/shiyanlou/result

來源

2016年百度校招面試題

這題把前兩天學的東西都涵蓋了,於是乎就又學習了一下前面的知識。
還是一臉蒙逼,參考了網上的兩個答案,居然發現有兩個版本
首先下載數據庫,這個沒有問題:
下面看下兩個答案
第一個:

cat data1| cut -c 8-| cut -d ' ' -f 1| sort | uniq -dc| sort -t ' ' -k1 -n -r| head -3 > /home/shiyanlou/result

第二個:

cat data1| cut -c 8-| sort | uniq -dc| sort -t ' ' -k1 -n -r| head -n -3 > /home/shiyanlou/result

首先解析一下 cut -c 8- , 這個是 cut 命令,參數 -c 8- 表示從 第8 字符開始到最後,注意一下cut 的主要參數:
主要參數
-b :以字節爲單位進行分割。這些字節位置將忽略多字節字符邊界,除非也指定了 -n 標誌。
-c :以字符爲單位進行分割。
-d :自定義分隔符,默認爲製表符。
-f :與-d一起使用,指定顯示哪個區域。
-n :取消分割多字節字符。僅和 -b 標誌一起使用。如果字符的最後一個字節落在由 -b 標誌的 List 參數指示的
範圍之內,該字符將被寫出;否則,該字符將被排除。
至於爲什麼是 8- ,cat data1 數了一下命令開始位置正好是第8位。

然後第一個答案比第二個答案多了一個 cut -d ’ ’ -f 1, 這裏涉及到了cut 的另外一個命令,以空格爲分隔符,選取第一個域,這樣,第一個命令和其他的路徑等分開了。這種答案也就是指考慮第一個命令,後面的差異不管。

然後就是 sort | uniq -dc 這裏涉及到兩個命令, uniq命令可以去除排序過的文件中的重複行,因此uniq經常和sort合用。也就是說,爲了使uniq起作用,所有的重複行必須是相鄰的。前兩天偷懶,沒有做筆記,下面是uniq命令的介紹(借鑑博客:linux sort,uniq,cut ,wc 命令

uniq [-icu]
-i :忽略大小寫字符的不同;
-c :進行計數
-u :只顯示唯一的行

testfile的內容如下:
hello
world
friend
hello
world
hello

使用uniq 去重,沒有效果:
uniq testfile
hello
world
friend
hello
world
hello

排序文件,默認是去重
cat words | sort |uniq
friend
hello
world

排序之後刪除了重複行,同時在行首位置輸出該行重複的次數
sort testfile | uniq -c
1 friend
3 hello
2 world

僅顯示存在重複的行,並在行首顯示該行重複的次數
sort testfile | uniq -dc
3 hello
2 world

僅顯示不重複的行
sort testfile | uniq -u
friend

然後就是 sort -t ’ ’ -k1 -n -r 這個就是重新根據去重後的數量排序的命令。參數的具體含義是-k 1 按照第一個區域排序, -n 使用純數字排序,-r 是反向排序。
其餘命令如下:

選項 參數
-f 忽略大小寫的差異,例如 A 與 a 視爲編碼相同
-b 忽略最前面的空格符部分
-M 以月份的名字來排序,例如 JAN, DEC 等等的排序方法
-n 使用『純數字』進行排序(默認是以文字型態來排序的)
-r 反向排序
-u 就是 uniq ,相同的數據中,僅出現一行代表
-t 分隔符,默認是用 [tab] 鍵來分隔
-k 以那個區間 (field) 來進行排序的意思

最後 head -n -3 或者 head -3 輸出前三個,貌似不加-n 的參數影響不大。通過’>’ 從輸出端 重定向到 文件 /home/shiyanlou/result

如果從整體上,所有命令的角度考慮,第二個答案是對的,也是實驗可以通過的,如果只是考慮第一個命令,那第一種答案是對的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章