shell腳本統計
⑴ shell腳本的單詞統計問題
#/bin/bash
if[-f"a.txt"];then
grep-E-o"[[:alpha:]]+"a.txt|awk'{count[$0]++};END{for(wordincount){printword,count[word]}}'|sort-k2>count.txt
else
echo"thisisnofilea.txt,pleasecheck"
exit-1
fi
⑵ shell腳本統計某一行指定字元個數
假如是ifconfig輸出,利用管道
ifconfig | grep HWaddr | grep : -o | wc -l
先找到 HWaddr 所在的行
然後找到:
然後wc統計下個數
⑶ shell腳本大全
一、實現Ping一個網段的所有IP,並檢測網路連接狀態是否正常
1、案例1
2、案列2
二、判斷網路是否流暢
三、根據文件中的用戶名信息創建用戶
四、點名器
五、對100以內的整數相加
六、統計一定時間內所有訪問 apache 伺服器的請求有多少個
七、統計一定時間內所有訪問本機 Aapche 伺服器的遠程 IP 地址是什麼
八、統計每個遠程IP訪問了本機apache的次數
九、統計當前linux系統中可以登錄計算機的賬戶有多少個
十、統計某個文件下有多少個文件並顯示這些文件名
⑷ linux shell腳本中如何統計某一行中某字元出現的個數
1、統計某個字元的個數,以a為例
grep -o a urifle
awk -F "" '{for(i=1;i<=NF;++i) if($i=="a") ++sum}END{print sum}' urfile
#-F ""中間必須要有空格 "a"必須使用雙引號,字元串
awk -F "" '{for(i=1;i<=NF;i++)a[$i]++}END{for(j in a) if(j=="c") print a[j]}' urfile
#
2、儲存在變數里
echo "0001111" |tr -cd 1 |wc -c
如果有時間可以看看《Linux就該這么學》,裡面有各種Linux相關知識
⑸ 如何用shell腳本統計出當前目錄下子目錄,還有所有可讀,可寫,可執行的文件的個數
#!/bin/bash
fcnt=0
dcnt=0
frcnt=0
fwcnt=0
fxcnt=0
forfilein*
do
if[-f$file];then
letfcnt+=1
if[-r$file];then
letfrcnt+=1
fi
if[-w$file];then
letfwcnt+=1
fi
if[-x$file];then
letfxcnt+=1
fi
elif[-d$file];then
letdcnt+=1
fi
done
echo"Thereare$fcntfilesin$PWD"
echo-e" Thereare$frcntreadablefilesin$PWD"
echo-e" Thereare$fwcntwriteablefilesin$PWD"
echo-e" Thereare$fxcntexecuteablefilesin$PWD"
echo"Thereare$dcntdirectoriesin$PWD"
⑹ Shell腳本-awk統計單詞數
統計passwd文件每個單詞出現的次數,這里以前5行為例
[root@web01 ~]# head -5 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
【思路】
【直接用awk數組的2次for循環】
[root@web01 ~]# head -5 /etc/passwd | awk -F "[:/]" '{for (i=1;i<=NF;i++) S[$i]++}END{for (key in S) print key,S[key]}'
4 2
10
7 1
nologin 4
bin 4
x 5
adm 3
sbin 5
bash 1
spool 1
var 2
0 2
1 2
lpd 1
2 2
daemon 2
root 3
lp 2
3 1
【先把數據處理成一列 -tr】
[root@web01 ~]# head -5 /etc/passwd|tr "[:/]" "\n"|sed '/^$/d'
【用awk的內置變數RS做成一列】
[root@web01 ~]# head -5 /etc/passwd|awk -vRS="[:/\n]+" '{print $0}'
【接下來就可以用awk單次for循環,也可以用sort+uniq處理】
⑺ shell腳本實現統計目錄下(包括子目錄)所有文件的個數
在shell終端中輸入下列命令:
#在當前目錄生成腳本文件countfile
cat>countfile<<SCRIPT
#!/bin/sh
find"$@"-typef|
wc-l
SCRIPT
#為腳本添加許可權
chmod+xcountfile
#執行用例
./countfile~
⑻ Shell腳本實現MapRece統計單詞數程序
options:
(1)-input:輸入文件路徑
(2)-output:輸出文件路徑
(3)-mapper:用戶自己寫的mapper程序,可以是可執行文件或者腳本
(4)-recer:用戶自己寫的recer程序,可以是可執行文件或者腳本
(5)-file:打包文件到提交的作業中,可以是mapper或者recer要用的輸入文件,如配置文件,字典等。
(6)-partitioner:用戶自定義的partitioner程序
(7)-combiner:用戶自定義的combiner程序(必須用java實現)
(8)-D:作業的一些屬性(以前用的是-jonconf),具體有:
1)mapred.map.tasks:map task數目
2)mapred.rece.tasks:rece task數目
3)stream.map.input.field.separator/stream.map.output.field.separator: map task輸入/輸出數
據的分隔符,默認均為\t。
4)stream.num.map.output.key.fields:指定map task輸出記錄中key所佔的域數目
5)stream.rece.input.field.separator/stream.rece.output.field.separator:rece task輸入/輸出數據的分隔符,默認均為\t。
6)stream.num.rece.output.key.fields:指定rece task輸出記錄中key所佔的域數目
另外,Hadoop本身還自帶一些好用的Mapper和Recer:
(1) Hadoop聚集功能
Aggregate提供一個特殊的recer類和一個特殊的combiner類,並且有一系列的「聚合器」(例如「sum」,「max」,「min」等)用於聚合一組value的序列。用戶可以使用Aggregate定義一個mapper插件類,這個類用於為mapper輸入的每個key/value對產生「可聚合項」。Combiner/recer利用適當的聚合器聚合這些可聚合項。要使用Aggregate,只需指定「-recer aggregate」。
(2)欄位的選取(類似於Unix中的『cut』)
Hadoop的工具類org.apache.hadoop.mapred.lib.FieldSelectionMapRec幫助用戶高效處理文本數據,就像unix中的「cut」工具。工具類中的map函數把輸入的key/value對看作欄位的列表。 用戶可以指定欄位的分隔符(默認是tab),可以選擇欄位列表中任意一段(由列表中一個或多個欄位組成)作為map輸出的key或者value。 同樣,工具類中的rece函數也把輸入的key/value對看作欄位的列表,用戶可以選取任意一段作為rece輸出的key或value。
後來將slaves節點的hostname也修正為IP映射表內對應的名字,解決?
根據一位外國友人的說明,在rece階段 ,0-33%階段是 shuffle 階段,就是根據鍵值 來講本條記錄發送到指定的rece,這個階段應該是在map還沒有完全完成的時候就已經開始了,因為我們會看到map在執行到一個百分比後rece也啟動了,這樣做也提高了程序的執行效率。
34%-65%階段是sort階段,就是rece根據收到的鍵值進行排序。map階段也會發生排序,map的輸出結果是以鍵值為順序排序後輸出,可以通過只有map階段處理的輸出來驗證(以前自己驗證過,貌似確有這么回事,大家自己再驗證下,免得我誤人子弟啊)。
66%-100%階段是處理階段,這個階段才是真正的處理階段,如果程序卡在這里,估計就是你的rece程序有問題了。
索性等了一晚上,第二天終於有動靜了
和上面的記錄對比發現,從%67到%77用了11個小時!這明顯是rece程序效率太慢了。也可能是數據傾斜問題。中間也試過增加recer的數量,但無果。最終我索性減少了輸入文件的行數,使其只有三行:
然後重新運行程序,瞬間得到了結果:
可見,結果是正確的。
令人詫異的是很快就執行完了,難道真的是shell腳本不適合做類似統計這樣的事情嗎?
⑼ 大佬們怎麼用shell腳本,統計當前用戶最常用的指令及其對應的歷史使用次數,而且輸出前5個啊
history | awk '{print $2}' | sort -rn |uniq -c|sort -rn |head -5
⑽ 怎樣編寫shell腳本實現統計一個小組的成績情況,統計信息包括:總分,平均分,最高分
#!/bin/bash
# 2013/07/01 sun
#功能說明:實現統計錄入學生成績的總人數,得出最高分,最低分,平均分,方差,標准方差,還有各個分數段的所佔百分比
echo "請輸入所有學生的成績,以空格隔開:"
read -a score_arr
#定義一個數組來存放用戶輸入的成績
sorted_arr=($(printf '%s\n' "${score_arr[@]}"|sort -n -r))
#錄入學生成績,並且是成績之間使用空格隔開
declare -i i b=0 c=0 d=0 e=0 f=0
#定義變數i來循環數組,依次讀出數組裡面的數據,定義五個初值為0的變數來存放每個分數段的人數
for (( i=0; $i<${#sorted_arr[@]}; i=$i+1 ))
#進行for循環,依次取出數組裡面的數據
do
#對每個取出來的數據進行判斷
case ${sorted_arr[i]} in
?|?\.*|[1-5]?|[1-5]?\.*)
#如果取出數組裡面的數據在60分以下
b=$(($b+1));;
#變數b自加1,進行統計數據
6?|6?\.*)
#如果取出數組裡面的數據在60分--69分之間
c=$(($c+1));;
#變數c自加1,進行統計數據
7?|7?\.*)
#如果取出數組裡面的數據在70分--79分之間
d=$(($d+1));;
#變數d自加1,進行統計數據
8?|8?\.*)
#如果取出數組裡面的數據在80分--89分之間
e=$(($e+1));;
#變數e自加1,進行統計數據
100|100\.0|9?|9?\.*)
#如果取出數組裡面的數據在90分--100分之間
f=$(($f+1));;
#變數f自加1,進行統計數據
*)
score_rank[i]="Not a Score";;
esac
done
#判斷結束
count=$(($b+$c+$d+$e+$f))
#算出總人數
declare -i j max min ave countall=0 u ua=0 ual=0 uall=0 fang
#定義變數j,最大值max,最小值min,平均數ave,所有人的分數之和countall
max=${sorted_arr[0]}
#獲取排序後的數組的第一個數,也就是最大數
j=$((${#sorted_arr[@]}-1))
#得到排序後的數組的最後的一個分數的下標
min=${sorted_arr[j]}
#獲取排序後的數組的最後一個數,也就是最小數
for (( j=0; $j<${#sorted_arr[@]}; j=$j+1 ))
#進行for循環,讓學生成績相加,算出學生成績的總分
do
countall=$countall+${sorted_arr[j]}
done
ave=$countall/$count
#算出平均成績
for (( j=0; $j<${#sorted_arr[@]}; j=$j+1 ))
#進行for循環,讓學生成績相加,算出學生成績的總分
do
ua=$(awk -v va=${sorted_arr[j]} -v vb=$ave 'BEGIN{printf "%2d" ,va-vb}')
#讓每一個數都減去平均數然後賦值於ua
ual=$(awk -v va=$ua -v vb=$ua 'BEGIN{printf "%2d" ,va*vb}')
#算得ua的平方
uall=$(awk -v va=$uall -v vb=$ual 'BEGIN{printf "%2d" ,va+vb}')
#算出它們的總合,也就是方差
done
u=$(awk -v va=$uall -v vb=$count 'BEGIN{printf "%2d" ,va/vb}')
#算出學生成績的平均分,並賦值於ave
#下面是計算每個分數段的百分數
countb=$(awk -v va=$b -v vb=$count 'BEGIN{printf "%2.2f%%" ,va*100/vb}')
#echo $countb
countc=$(awk -v va=$c -v vb=$count 'BEGIN{printf "%2.2f%%" ,va*100/vb}')
#echo $countc
countd=$(awk -v va=$d -v vb=$count 'BEGIN{printf "%2.2f%%" ,va*100/vb}')
#echo $countd
counte=$(awk -v va=$e -v vb=$count 'BEGIN{printf "%2.2f%%" ,va*100/vb}')
#echo $counte
countf=$(awk -v va=$f -v vb=$count 'BEGIN{printf "%2.2f%%" ,va*100/vb}')
#echo $countf
#輸出結果
echo "總人數 最高分 最低分 平均分 方差 "
echo "$count $max $min $ave $u "
echo "標准方差="
echo "scale=5;sqrt($u)" | bc
#算出標准方差
echo " 60分以下 60--69 70--79 80--89 90--100"
echo "人數" " $b $c $d $e $f"
echo "比例" "$countb $countc $countd $counte $countf"