一道shell筆試題
阿新 • • 發佈:2019-02-01
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命令
- 預設升序,-r降序
- 指定排序的鍵所在的域,-k 3,預設分隔符為空格,可以用-t設定分隔符