Linux Shell经典面试题(其七)
参考:http://laoxu.blog.51cto.com/4120547/1285664
- 获取1-9的顺序的数字。
# 1. 类似seq 1 9或seq 9
$ for i in `seq 1 9`;do echo $i;done
# 2. 类似for i in {1..9};do echo $i;done
$ for ((i=1;i<=9;i++));do echo $i;done
# 3.
$ seq -s " " -w 9
# 4.
echo {1..9}
- 获取如下的数字输出
12345
1234
123
12
1
#!/bin/bash
a={1..5}
for i in {5..1}
do
echo ${a[*]:0:$i}
done
- 获取如下数字输出。
55555
4444
333
22
1
#!/bin/bash
for ((i=5;i>=1;i--))
do
for ((j=1;j<=i;j++))
do
echo -n "$i"
done
echo ""
done
- 输出26272829303132333435
$ echo 2{6..9} 3{0..5}
- 倒序输出数字9-1
$ echo {9..1}
$ seq -s " " 9 -1 1
- s输出0-36之间的奇数
$ seq -s " " 1 2 36
- 输出0-36之间的偶数
$ seq -s " " 0 2 36
- 输出以三位数字表示的0-100
# 1.
$ printf "%03d " {0..100};echo
# 2.
$ echo {000..100}
# 3.
$ seq -s " " -w 0 100
# 4.
$ awk 'BEGIN{for (i=0;i<=100;i++)printf("%03d",i)}'
# 5.
$ for ((i=0;i<=100;i++));do printf "%03d" ¥i;done
- 有一个文本(文件名user),格式如下:
Leo:456:7890:11
Vincent:333:43434:2
Rack:4343:4343:222
Leo:444:33:4343
Rack:1:1:1
Tiger:1:32:4
要求:
1>.提取第二列的所有值,并对其排序。
2>.计算第二列总和。
3>.找出第二、三和四列之和的最大值。
4>.假如有一百万个这样的文本(user文本),每个文本大小为500M,用最快的方式统计哪个用户(第一列)的后面三列(第2,3和4列)之和最大。[注]可以使用shell脚本或者java语言实现以上功能。
# 1>答案如下:
awk -F: '{print $2}' user | sort -nr
# 2>答案如下:
awk -F: '{print $2}' user | awk '{ s += $1 } END { print "sum =",s}'
# 3>答案如下:
# shell脚本sh compare.sh
#!/bin/bash
a=`awk -F: '{print $2}' user | sort -n | awk '{ s += $1 } END { print s}'`
b=`awk -F: '{print $3}' user | sort -n | awk '{ s += $1 } END { print s}'`
c=`awk -F: '{print $4}' user | sort -n | awk '{ s += $1 } END { print s}'`
if [ $a -gt $b ]
then big=$a
else big=$b
fi
if [ $big -gt $c ]
then echo $big
else echo $c
fi
# 4>思路如下:
// 需要用java实现,hadoop的mapreduce,shell脚本很难很难实现15PB的大数据分析,除非拆分后统计再合并结果,效率非常低。
- 下面是nginx的error log日志格式,统计出日志中频次最多的10个ip地址。(linux shell实现)
2016/09/04 22:49:09 [info] 100628#0: *2484247857 client 222.209.36.221 closed keepalive connection
2016/09/04 22:49:09 [info] 100630#0: *2484247829 client 111.7.170.139 closed keepalive connection
2016/09/04 22:49:09 [info] 100630#0: *2484247821 client 218.5.167.236 closed keepalive connection
2016/09/04 22:49:09 [info] 100630#0: *2484247840 client 101.81.231.92 closed keepalive connection
2016/09/04 22:49:09 [info] 100624#0: *2484251224 client 110.231.191.199 closed keepalive connection
2016/09/04 22:49:09 [info] 100624#0: *2484251198 client 116.231.232.56 closed keepalive connection
2016/09/04 22:49:09 [info] 100630#0: *2484247835 client 119.131.77.206 closed keepalive connection
# linux shell执行命令如下
$ awk '{c[$7]++}END{for(i in c) print i,c[i]}' | sort -k2 -nr | head