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"