新浪系统工程师笔试--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.sina.com.cn/s/blog_578d34d901018z4o.html

你可能感兴趣的:(面试/笔试)