您的位置:首页 > 运维架构 > Shell

面试中的shell脚本问题(不断更新,欢迎补充)

2013-08-30 13:52 357 查看
Q1:获取1-9的顺序数字
shell方法一:

foriin`seq19`;doecho$i;done类似seq19或者seq9
1
2
3
4
5
6
7
8
9
shell方法二:
for((i=1;i<=9;i++));doecho$i;done类似foriin{1..9};doecho$i;done

1
2
3
4
5
6
7
8
9
python方法三:
脚本内容
#!/usr/bin/python
for i in range(1,10):
print ('%s') % i

结果输出

1
2
3
4
5
6
7
8
9
sehll方法四:

seq-s""-w9
1 2 3 4 5 6 7 8 9
shell方法五:
echo{1..9}

1 2 3 4 5 6 7 8 9
Q2:获取如下的数字输出
12345
1234
123
12
1

shell方法:

#!/bin/bash
a=({1..5})
for i in {5..1}
do
echo ${a[*]:0:$i}
done
Q3:获取如下数字输出
55555
4444
333
22
1

shell方法:

#!/bin/bash
for ((i=5; i>=1; i-- ))
do
for ((j=1; j<=i; j++ ))
do
echo -n "$i"
done
echo ""
done
Q4:输出26272829303132333435
echo2{6..9}3{0..5}
26 27 28 29 30 31 32 33 34 35
Q5:倒序输出数字9-1
seq-s""-w9-11

9 8 7 6 5 4 3 2 1
Q6:输出0-36之间的奇数
seq-s""1236

1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35
Q7:输出0-36之间的偶数

seq-s""0236

0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36
Q8:输出以三位数字表示的0-100
方法一:printf"%03d"{0..100};echo

000 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092 093 094 095 096 097 098 099 100
方法二:echo{000..100}
000 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092 093 094 095 096 097 098 099 100

方法三:seq-s""-w0100
000 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092 093 094 095 096 097 098 099 100


方法四:awk'BEGIN{for(i=0;i<=100;i++)printf("%03d",i)}'
000 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092 093 094 095 096 097 098 099 100
方法五:for((i=0;i<=100;i++));doprintf"%03d"$i;done
000 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092 093 094 095 096 097 098 099 100
如果只是输出1-100,还可以使用
yes|grepy|sed100q|awk'{printf("%03d",NR)}';echo竖着输出:yes|nl-ba|tr''0|sed100q|cut-b4-6
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092 093 094 095 096 097 098 099 100

Q9:如何打印空白行的位置,文件内容如下



#grep-n^$a.txt显示第2、5、6行为空行
2:
5:
6:

Q10:如下显示如何使A+B=C?
A=1.1.1.1
B=2.2.2.2
C=1.1.2.2
#A=1.1.1.1;B=2.2.2.2;echo C="`expr substr"$A"14`" "`expr substr"$B"13`"
C=1.1.2.2
Q11:将文件file的内容如下,如何将第二排的第二个逗号替换为空格?

a,b,c,d,e
a,b,c,c,e
a,d,e,t,c
#sed -e "2s/^\(...\{1\}\),/\1 /" file

a,b,c,d,e
a,b  c,c,e
a,d,e,t,c


Q12:有一个文本(文件名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
456
333
4343
444
1
1
2. awk -F: '{print $2}' user | awk '{ s += $1 } END { print "sum =",s}'
sum = 5578
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
55733

4.思路:需要用java实现,hadoop的mapreduce,shell脚本很难很难实现15PB的大数据分析,除非拆分后统计再合并结果,效率非常低。

不断更新。。。。

我遇到的能想到的就这些,欢迎大家给我留言!提出不同的解决方法和遇到过的问题,非常感谢!

本文出自 “老徐的私房菜” 博客,谢绝转载!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: