標籤:指令碼 shell 面試 筆試
原題目:
一個文本類型的檔案,裡面每行存放一個登陸者的IP(某些行是重複的),寫一個shell指令碼輸出登陸次數最多的使用者。
之前剛看到這個題目時,馬上沒有想到一行直接解決的辦法,雖然知道可以先進行排序,但是後面由於對uniq命令的參數不熟悉,所以用了比較背的辦法,就是直接編寫shell指令碼程式來解決這個問題。
現在假設測試資料如下:
111.111.111.11110.10.10.10222.222.222.222111.111.111.111333.333.333.33310.10.10.10111.111.111.111333.333.333.33310.10.10.10222.222.222.222333.333.333.33310.10.10.10111.111.111.111222.222.222.222333.333.333.33310.10.10.10111.111.111.111111.111.111.111333.333.333.333333.333.333.333333.333.333.333222.222.222.22210.10.10.10222.222.222.222111.111.111.111333.333.333.333333.333.333.333111.111.111.11110.10.10.10333.333.333.333222.222.222.222222.222.222.222222.222.222.222222.222.222.222111.111.111.111111.111.111.111333.333.333.333333.333.333.333333.333.333.333333.333.333.333
解決此問題的指令碼程式如下:
#!/bin/cshset LINES=`sort $1`set i=1set num=`cat $1 | wc -l`set max=0set cur=""set counter=1set ip=""while ( $i <= $num )if ( $LINES[$i] != $cur ) thenif ( $max < $counter )thenset max=$counterset ip=$curendifset counter=1set cur=$LINES[$i]else@ counter++endif@ i++endif ( $max < $counter ) thenset max=$counterset ip=$curendifecho $ip
首先對IP地址進行排序,排序後找到重複次數最多的那個IP地址就可以了。這個邏輯上還是比較簡單的。
但是如果知道可以用uniq命令輸出重複的次數的話,這個問題就變得很簡單了:
cat test.txt | sort | uniq -c | sort -r -n -k 1 | head -n 1 | awk ‘{print $2}‘
uniq -c命令將以重複次數作為第一列輸出,然後我們使用sort命令的-k指定按照第一列進行排序,-n表示使用數值排序方法而不是預設的字串排序,-r表示降序輸出。使用head輸出第一行,再用awk 輸出第二列便是重複次數最多的IP地址
面試筆試-指令碼-1:使用shell指令碼輸出登入次數最多的使用者