1. 程式人生 > >一道shell筆試題

一道shell筆試題

1. 題目

一個包含ip的文字檔案ip.txt,要求用shell命令統計每個ip出現的次數,並按降序排序

2. 解答

文字處理,行單位處理,用awk

awk '{num[$1]++} END{for(k in num)print k,"----",num[k] | "sort -rk 3"}' ip.txt

3. 涉及技術點

1. awk陣列

awk陣列允許將任何數字或者字串表示式作為索引(有點像python裡面的dict)。

2. awk程式模型

awk把輸入流看成一連串記錄的集合,每個記錄表示輸入檔案中的一行。一個awk程式由一對以模式+操作組合而成。

pattern {action} # 如果模式匹配,則執行操作
pattern # 如果模式匹配,則列印記錄(預設action) {action} # 對每條記錄,執行操所(預設pattern)

大部分pattern是數字或者字串表示式,awk保留兩個特殊的pattern

BEGIN {...}     # 讀取檔案之前執行
END {...}       # 讀完全部檔案之後執行

BEGIN和END可以有多個。多個BEGIN的執行順序由定義順序決定,END同。

上面的命令中,使用了2對pattern+action

{num[$1]++}

預設pattern,對每行輸入資料,都會進行處理

END{for
(k in num)print k,"----",num[k] | "sort -rk│ 3"}

在讀取全部檔案之後,執行大括號裡的指令。

3. awk中的迴圈

for迴圈有兩種形式

awk 'BEGIN { for(x=0; x<=1; x+=0.05) print x}'
awk 'BEGIN { for(name in names) print name}' # names是定義的陣列

4. awk呼叫shell命令

管道 + 雙引號

{for(k in num)print k,"----",num[k] | "sort -rk 3"}

5. sort命令

  1. 預設升序,-r降序
  2. 指定排序的鍵所在的域,-k 3,預設分隔符為空格,可以用-t設定分隔符