面試筆試-腳本-1:使用shell腳本輸出登錄次數最多的用戶
來源:程序員人生 發布時間:2014-11-10 08:09:02 閱讀次數:2888次
原題目:
1個文本類型的文件,里面每行寄存1個登陸者的IP(某些行是重復的),寫1個shell腳本輸出登陸次數最多的用戶。
之前剛看到這個題目時,馬上沒有想到1行直接解決的辦法,雖然知道可以先進行排序,但是后面由于對uniq命令的參數不熟習,所以用了比較背的辦法,就是直接編寫shell腳本程序來解決這個問題。
現在假定測試數據以下:
111.111.111.111
10.10.10.10
222.222.222.222
111.111.111.111
333.333.333.333
10.10.10.10
111.111.111.111
333.333.333.333
10.10.10.10
222.222.222.222
333.333.333.333
10.10.10.10
111.111.111.111
222.222.222.222
333.333.333.333
10.10.10.10
111.111.111.111
111.111.111.111
333.333.333.333
333.333.333.333
333.333.333.333
222.222.222.222
10.10.10.10
222.222.222.222
111.111.111.111
333.333.333.333
333.333.333.333
111.111.111.111
10.10.10.10
333.333.333.333
222.222.222.222
222.222.222.222
222.222.222.222
222.222.222.222
111.111.111.111
111.111.111.111
333.333.333.333
333.333.333.333
333.333.333.333
333.333.333.333
解決此問題的腳本程序以下:
#!/bin/csh
set LINES=`sort $1`
set i=1
set num=`cat $1 | wc -l`
set max=0
set cur=""
set counter=1
set ip=""
while ( $i <= $num )
if ( $LINES[$i] != $cur ) then
if ( $max < $counter ) then
set max=$counter
set ip=$cur
endif
set counter=1
set cur=$LINES[$i]
else
@ counter++
endif
@ i++
end
if ( $max < $counter ) then
set max=$counter
set ip=$cur
endif
echo $ip
首先對IP地址進行排序,排序后找到重復次數最多的那個IP地址就能夠了。這個邏輯上還是比較簡單的。
但是如果知道可以用uniq命令輸出重復的次數的話,這個問題就變得很簡單了:
cat test.txt | sort | uniq -c | sort -r -n -k 1 | head -n 1 | awk '{print $2}'
uniq -c命令將以重復次數作為第1列輸出,然后我們使用sort命令的-k指定依照第1列進行排序,-n表示使用數值排序方法而不是默許的字符串排序,-r表示降序輸出。使用head輸出第1行,再用awk 輸出第2列便是重復次數最多的IP地址
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈