Shell

一、编写shell程序,实现自动删除50个帐号的功能。帐号名为stud1至stud50。
     一句话思路:找出规律,循环解决
     for((i=1;i<51;i++));do userdel -r stud$i ;done
     知识点:for循环,固然是用while循环也是能够的,until也行。
  
二、某系统管理员需天天作必定的重复工做,请按照下列要求,编制一个解决方案:
(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
  
    知识点:awk的输出重定向,固然用管道也是能够的。tar命令打包参数,这样作会有一个提示,只是去掉了目录不用理会。

  三、gameser这个服务启动命令为./gameser服务,请写一个脚本,当服务宕掉,脚本自动拉起gameser服务。
  
    一句话思路:进程管理
  
#!/bin/bash

while true;do

        result=`ps aux | grep gameser | wc -l`
  
        if [ $result -lt 2 ];then  ./gameser; fi
  
        sleep 5
done
  
知识点:还可使用pgrep命令。
  
四、linux crontab;请在3月23号21点18分的时候,重启服务器
  
    一句话思路:计划任务+关机
  
    crontab -e
    18 21 23 3 * init 6
  
    知识点:可能会延展提问到最安全的关机命令,“写缓存”sync 最好两遍,有人说三遍,其实四遍也行,要不干脆仍是别关机了!
  
五、你想天天23:00运行xxxx.sh脚本。并自动进行日志分析。第2天上班的时候看到分析结果 给出你的部属方案
  
    一句话思路:计划任务,日志分析
  
    0 23 * * * sh ****.sh;err=$?;logger -p cron.err $err
  
    知识点:第一个参数必定要写零,不然在定义的23点里每分钟都会执行。计划任务只有当报错的时候才会以邮件形式发送给用户,因此这里使用logger命令将消息发送给日志服务器,这里只是发送了命令返回值,你能够随意发送内容,看你喜欢了。
  
六、要求:运行脚本输入两个数获得以下结果:

  #sh xxx.sh 2 3
      **
      ***
      *****
  
    一句话思路:看到这个第一反应就是循环呗。
  
#!/bin/bash
line1=$1
line2=$2
let line3=$1+$2
while [ $line1 -gt 0 ];do
        echo -n *
        let line1=$line1-1
done
        echo
while [ $line2 -gt 0 ];do
        echo -n *
        let line2=$line2-1
done
        echo
while [ $line3 -gt 0 ];do
        echo -n *
        let line3=$line3-1
done
        echo
  
    知识点:若是你的第一反应是使用循环,那就进入一个死循环了,由于根本就没有规律。咱们都知道,循环是依靠必定规律的。echo 的 -n参数。*在shell中是通配符,因此要加转义字符。(但愿你能给出更好的解决方案!)
  
九、查找文件后缀是log的 三天前的文件删除
  
    一句话思路:查找就必定是find
  
    find / -name "*.log" -and -mtime +3 -exec rm -rf {} ;
  
    知识点:-mtime  + 表明后面数字以外的,- 就是以内的。
  
十、写一个脚本将目录下大于100kb的文件移动到/tmp下

      一句话思路:同上
  
    find ./ -size +100k -exec mv {}  /tmp ;
  
    知识点:-exec  {}  ; 标准写法,没有好办法,背吧。
php


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)
  
    这个题在前一篇中已经给出答案,这里就再也不赘述。

    http://7648853.blog.51cto.com/4990508/851407
  
十二、过滤出当前目录下全部以字母(不区分大小写)开头的文件
  
    一句话思路:过滤就是grep
  
    ls | grep -P "^[a-zA-Z]"
  
    ls | grep -P -i "^[a-z]"
  
    知识点:正则表达式,使用-i参数让grep命令不区分大小写。
  
1三、文件A.txt内容为"12:34:68",只输出A.txt中的"34"
  
    一句话思路:提取内容就是awk
  
    awk  -F ":" '{print $2}' A.txt
  
    知识点:awk 域,-F参数指定分隔符,默认分隔符是空格。
   
1四、用sed命令实现直接将文件B.TXT中的全部123替换成345
  
    一句话思路:没思路了,人家都说了用sed
  
    sed -i 's/123/456/g' B.TXT
  
    知识点:-i参数让sed修改文件,默认不修改源文件。题目中提到了全部字样,因此要使用g参数。
  
1五、用sed修改文件mailbox.txt的20行的zhango为wang
  
    一句话思路:命题做文sed,没有瞎想空间
  
    sed -i '20s/zhango/wang/' mailbox.txt
  
    知识点:上题是全局,这题规定了行。若是写成这样"/20/",就是正则表达式了。
  
1六、正则表达式,IP地址的匹配,写一下
  
    一句话思路:遥想当年,web开发程序员面试不出意外的第一道题。
  
    ([0-9]{1,3}.){1,3}([0-9]){1,3}
  
    知识点:正则表达式,写个简单的,这个答案不严谨,但考虑到只是面试,因此将就将就也能用。
  
1七、写出命令。统计日志文件weblog.log中 今天14:00~15:00的记录条数(时间格式:2011-01-01—15:30:11)
  
    一句话思路:第一反应,这个要用awk,分析统计嘛。可真要用awk麻烦就大了。
  
    sum14=`grep -c "2011-01-01-14" weblog.log`
    sum15=`grep -c "2011-01-01-15" weblog.log`
    echo $[$sum14+$sum15]

    知识点:grep命令-c参数,统计匹配的行数。shell中的数学计算。
  
1八、求一组数的最大值和最小值

      一句话思路:运维愈来愈像开发了,冒泡法都有了。愈来愈难混了,一个运维不看手册,要看算法了。
  
    知识点:去看书吧,看算法的。

  
1九、将当前目录全部文件扩展名改成log
  
    一句话思路:若是你的第一反应是使用find命令,那么恭喜你,你中了敌人的奸计,不是不能实现,是很麻烦。
  
for file in `ls ./ | grep -P "(.*)(..*)"`;do  echo $file | mv $file `sed -r 's#(.*)(..*)#1.log#'`; done
  
for file in `ls ./ | grep -P "(.*)(..*)"`;do  echo $file | mv $file `echo ${file%.**}`.log; done
  
    知识点:第一个方法中使用了sed,第二个方法中使用了字符操做,#从前向后数,%从后向前数。其实说白了,就是为了拼凑出 mv 参数1 参数2。其实不少时候,编写shell脚本的时候要学会反向推导,逆向思考。
  
       还有一种方法是使用cut命令,但若是遇到文件有两个扩展名的状况下就会出现问题。redhat as4 安装完成后,在root目录下会生成install.log  install.log.syslog这两个文件,若是使用cut就会出现错误。具体缘由 在这里就不说了。运维嘛,须要的是严谨!
  
20、用shell在/usr/local下 创建20个子目录 xunlei1-xunlei20,再在这个子目录下分别建255个子目录dir1-dir255,再在255个子目录下建立10000个文件xunlei1.html-xunlei10000.html
  
    一句话思路:这有啥,{}大括号呗。
  
    mkdir -p /usr/loca/xunlie{1..20}/dir{1..255}/

    touch   /usr/loca/xunlie{1..20}/dir{1..255}/xunlei{1..10000}.html  
   

    知识点:若是你就这么写上去,那你又中计了。为何呢,由于超过了shell命令参数的最大限制。shell中参数的限制是:5452。因此要分着写。html

相关文章
相关标签/搜索