新浪系统工程师笔试--shell
1.
test01 test02
1 200 1 100
2 500 2 300
3 200 3 50
4 100 4 150
输出
200 100 100
500 300 200
300 50 150
100 150 -50
awk 减法数组
awk ‘ NR == FNR { a[NR]=$2 } NR != FNR { print a[FNR], $2,(a[FNR]-$2)} ' /root/test*
2.
123abc456
456def123
567abc789
789def567
要求输出:
456ABC123
123DEF456
789ABC567
567DEF789
sed -r 's/([1-9]{3})([a-f]{3})([1-9]{3})/\3\2\1/;y/abcdef/ABCDEF/'
3. 编写shell程序,实现自动删除50个账号的功能。账号名为stud1至stud50。
for((i=1;i<51;i++))
do
userdel -r stud$i
done
4. 某系统管理员需每天做一定的重复工作,请按照下列要求,编制一个解决方案:
(1)在下午4 :50删除/abc目录下的全部子目录和全部文件;
(2)从早8:00~下午6:00每小时读取/xyz目录下x1文件中每行第一个域的全部数据加入到/backup目录下的bak01.txt文件内;
(3)每逢星期一下午5:50将/data目录下的所有目录和文件归档并压缩为文件:backup.tar.gz;
crontab -e
50 16 * * * rm -rf /abc/*
* 8-18/1 * * * awk '{print $1 > "/backup/bak01.txt"}' /xyz/x1
50 17 * * 1 tar -czf backup.tar.gz /data
5. gameser这个服务启动命令为./gameser服务,请写一个脚本,当服务宕掉,脚本自动拉起gameser服务。
#!/bin/bash
while true;do
result=`ps aux | grep gameser | wc -l`
if [ $result -lt 2 ];then
./gamester
fi
sleep 5
done
6. linux crontab;请在3月23号21点18分的时候,重启服务器
crontab -e
18 21 23 3 * init 6
7. 你想每天23:00运行xxxx.sh脚本。并自动进行日志分析。第2天上班的时候看到分析结果 给出你的部属方案
0 23 * * * sh ****.sh;err=$?;logger -p cron.err $err
8. 运行脚本输入两个数得到如下结果:
#sh xxx.sh 2 3
**
***
*****
!/bin/bash
For((i=1;i<=$1;i++));do
echo –n \*
done
echo
For((i=1;i<=$2;i++));do
echo –n \*
done
echo
For((i=1;i<=$[$1+$2];i++));do
echo –n \*
done
echo
9. 查找文件后缀是log的 三天前的文件删除
find / -name "*.log" -and -mtime +3 -exec rm -rf {} \;
10. 写一个脚本将目录下大于100kb的文件移动到/tmp下
find ./ -size +100k -exec mv {} /tmp \;
11. 日志如下统计访问IP最多的前10个
192.168.0.6 - - [25/Nov/2010:13:55:10 +0800] "GET /cacti/images/auth_login.gif HTTP/1.1" 200 21265 "http://192.168.0.104/cacti/graph_view.php?action=tree&tree_id=2&leaf_id=8&page=3" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.1)"
192.168.0.6 - - [25/Nov/2010:13:55:14 +0800] "GET /favicon.ico HTTP/1.1" 404 287 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.1)
cut -d " " -f1 /etc/httpd/log/access_log | sort | uniq -c | sort -nr | head -10
12. 过滤出当前目录下所有以字母(不区分大小写)开头的文件
ls | grep -P -i "^[a-z]"
13. 文件A.txt内容为"12:34:68",只输出A.txt中的"34"
awk -F ":" '{print $2}' A.txt
14. 用sed命令实现直接将文件B.TXT中的所有123替换成345
sed -i 's/123/456/g' B.TXT
15. 用sed修改文件mailbox.txt的20行的zhango为wang
sed -i '20s/zhango/wang/' mailbox.txt
16. 正则表达式,IP地址的匹配,写一下
([0-9]{1,3}\.){1,3}([0-9]){1,3}
17. 写出命令。统计日志文件weblog.log中 今天14:00~15:00的记录条数(时间格式:2011-01-01—15:30:11)
Echo weblog | grep –c “2011-01-01-14”
18. 将当前目录所有文件扩展名改为log
for file in `ls ./ | grep -P "(.*)(\..*)"`
do
echo $file | mv $file `sed -r 's#(.*)(\..*)#\1.log#'`
done
19. 用一行命令实现:查找当前目录下(含子目录),文件内容中含有sina且文件名以".config"结尾的文件
grep -lr "sina" ./ | grep -P "(.*)(\.config$)"
20. 用shell查询以“.”结尾的文件,并加上后缀“.ts”
find ./ -name "*." -exec mv {} {}ts \;
21. 假定某个web服务器访问log其中一行如下:
61.159.245.95 - - [30/Apr/2003:01:04:20 +0800] "GET / HTTP/1.1" 200 151 "http://www.baidu.com" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT
6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3; 360SE)"
该LOG文件超过10万行,如果列出最后的10万行中请求最多前十位IP,显示如下的结果:
119 211.101.169.200
103 211.101.169.206
50 61.149.38.249
11 202.106.138.194
请用一行命令显示出上面的结果
awk '{ip[$1]++}END{for(var in ip)print ip[var],var |"sort -nr|head -n10"}' log
22. linux下ifconfig命令显示结果如下:
eth0 Link encap:Ethernet HWaddr 00:0C:29:AA:E6:44
inet addr:192.168.213.128 Bcast:192.168.213.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:feaa:e644/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:39962 errors:0 dropped:0 overruns:0 frame:0
TX packets:27038 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:35108954 (33.4 MiB) TX bytes:6573610 (6.2 MiB)
Base address:0x2000 Memory:c9020000-c9040000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:1833 errors:0 dropped:0 overruns:0 frame:0
TX packets:1833 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:4840659 (4.6 MiB) TX bytes:4840659 (4.6 MiB)
执行如下命令
/sbin/ifconfig eth0|grep 'inet '|sed 's/^.*addr://g'|sed 's/ Bcast.*$//g'
请写出命令的输出结果
192.168.213.128
23. 多线程/多进程 程序同时访问相同的资源(例如:同时向一个文件里写数据)需要注意些什么?
至少注意文件锁,读锁与写锁
24. 写脚本实现,可以用shell,perl等。把文件B中有的,但是文件A中没有的所有行,保存为文件C,并统计C的行数
diff B A | grep "<" | sed 's/< //' > C
25. 脚本实现把/tmp/目录下所有创建超过7天的文件删除
find /tmp -mtime +7 -exec rm -rf {} \;
26. 把1 2 3 4 5 6按如下格式输出
1
2
3
4
5
6
如何实现
echo 1 2 3 4 5 6 | sed "s# #\n#g"
27. 设计一个shell程序,在2012年12月23日凌晨3点备份并压缩前一天/svn目录的所有内容,存放在/root/bak目录里,且文件名为如下形式svn.2008.05.06.tar.gz,试写脚本。
at 201212230300
at> find /svn -mtime +1 -and -mtime -2 -exec cp -r {} /root/bak \;
at> tar -czf svn.2008.05.06.tar.gz /root/bak
亚瑟王环
有1到100的数字序列。有计数器每数到12,就将计数器指向的数字在亚瑟环中剔除,问该序列中最后剩下的数字是多少?
#/bin/bash
for i in {1..100};do
huan[$i]=$i
done #先初始化一个数组,其实用变量也行,个人喜好,用awk也行,但一篇内容一个shell有点不合适。
t=0 #定义一个计数器
sum=0
while true;do #定义一个无限循环,因为确实不知道要数多少次。
for((i=1;i<101;i++));do
if [ ${huan[$i]} -gt 0 ];then #不等于零就把计数器加1
let t++
fi
if [ $t -eq 12 ];then #数到12就将数组中的数清零,同时计数器清零
huan[$i]=0
t=0
fi
done
for((i=1;i<101;i++));do #遍历数组,如果数组中只有一个数不为零就跳出循环
if [ ${huan[$i]} -gt 0 ];then
let sum++
sum[1]=${huan[$i]}
fi
done
if [ $sum -eq 1 ];then
break
else
sum=0
fi
done
echo ${sum[1]}
原文转自:http://blog.csdn.net/lwj103862095/article/details/11902213