`
famoushz
  • 浏览: 2870716 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

shell程序面试题

阅读更多

1.要求分析Apache访问日志,找出里面数量在前面100位的ip数.日志大约在78M左右.一下是apache日志文件

  节选(其中日志access.log):

        218.107.27.137 .....

        202.112.32.22 ....[26/Mar/2006:23:59:55 +0800].......

   shell程序如下:

     方法一:

        (1)#!/bin/bash

           #先找出唯一IP

            cat access.log|awk '{print $1}'|sort -d >ip.txt

        (2) 再用唯一的IP去日志里面计算出现的次数

            while read IP

                  do

                    COUNT=`cat access.log|grep $IP|wc -l`

                    echo $COUNT:$IP >>count.txt

                  done< ip.txt

                  cat count.txt|sort -n -r|head -100 > top100.txt

                  echo "" > count.txt

      方法二:

           awk '{print $1}' access.log|sort -n -t. +0 +1 +2 +3|uniq -c|sort -nr|head -100

      方法三:

           cat access.log|awk '{print $1}'|sort|uniq -c|awk 'NR<=100{print $1,$2}'|sort -r

      方法四:

           cat access.log|awk '{print $1}'|sort -n|uniq -c|sort -nr|head -100

2. 百度上使用site inurl语法查询,输入site:www.baidu.com inurl:news,则会搜出所有在www.baidu.com

  站点上的包含"news"子串的url.

   现在有两份数据:一份是site_inurl.txt,一份是url.txt.其中,site_inurl.txt中每一行是一个site

   inurl 语法组成的查询串,url.txt保存的是url列表.

      在url列表中找出所有能被site_inurl.txt中查询串检索到的url

      如:site中inurl.txt内容如下:

             site:www.baidu.com inurl:/more

             site:zhidao.baidu.com inurl:/browse/

             site:www.sina.com.cn inurl:www20041223am

       url.txt内容如下:

            http://www.baidu.com/more/

            http://www.baidu.com/guding/more.html

            http://www.baidu.com/events/20060105/photomore.html

            http://hi.baidu.com/browse/

            http://hi.baidu.com/baidu/

            http://www.sina.com.cn/head/www20021123am.html

            http://www.sina.com.cn/head/www20041223am.html

      则你的程序运行结果应该为:

            http://www.baidu.com/more/

            http://www.baidu.com/guding/more.html

            http://www.sina.com.cn/head/www20041223am.html

      shell程序:

                   #!/bin/bash

                   #file.sh

                   while read -r line

                   do

                      set $(echo $line|awk -F"[: ]" '{print $2,$4}')

                      grep "$1.$2" url.txt

                   done < inurl.txt

      注意公式:

                  echo "forum-45-85.html|cut -d- -f3|cut -d. -f1

1.编写一个名为cala的shell过程,其功能是小型计算器,可以进行加减乘除运算。两个操作数由位置给出

  (位置参数1和3为两操作数,位置参数2是运算符),并将四种运算加到cala文件中。

                  #!/bin/sh

                  #operation.sh

                  a_number()                     //注释:判断是否为数字的函数

                   {

                     _NUM=$1

                     _NUM=`echo $1|awk '{if($0~/[^0-9]/) print "1"}'`

                     if [ -z $NUM ]

                       then

                            return 1

                       else

                            return 0

                      fi

                    }

                  ARGS=3

                  TESTFILE=cala

                  E_BADARGS=65

                  if [ "$#" -ne "$ARGS" ]

                     then

                           echo "Usage:`basename $0` the operation needs right parameters"

                           echo $E_BADARGS

                  fi

                  if a_number $1 -a a_number $3 ; then

                      echo "error parameters"

                      exit 1

                  fi

                  case $2 in

                     +) A=$(($1 + $2))

                        echo "$1 + $3 = $A" >>$TESTFILE

                        ;;

                     -) A=$(($1 - $2))

                        echo "$1 - $2 = $A" >>$TESTFILE

                        ;;

                     \*) A=`expr $1 \* $3`       //注释:等号后面不能有空格,否则bash不识别

                        echo "$1 * $3 = $A" >>$TESTFILE

                        ;;

                      /) A=`expr $1 / $3`

                        echo "$1 /$3 = $A" >>$TESTFILE

                        ;;

                   esac

                   exit $?

2. 将一目录的所有文件的扩展名改为bak

                 (1)#!/bin/sh

                      #changextent.sh

                      for i in *

                          do

                             if [ -f $i ] ; then

                                mv $i ${i%%.*}.bak

                             fi

                          done

                  (2) for myfile in *

                         do

                            if [ -f $myfile ]

                               then

                                   if [ ${myfile##*.}!="bak" ]

                                      then

                                          mv $myfile ${myfile%.*}.bak

                                    fi

                             fi

                           done

3.将两个文件a和b中相同的单词删除,区分大小写

                #!/bin/sh

                #letterdel.sh

                File1=a

                File2=b

                File3=a.$$

                File4=b.$$

                tr -sc 'A-Za-z' '\012' <$File1|sort|uniq >$File3

                tr -sc 'A-Za-z' '\012' <$File2|sort|uniq >$File4

                while read line

                    do

                       temp=`awk -v output=$line '{if($1==output) print "1"}' $File4`

                       if [ "$temp" ==1 ]

                           then

                                sed "s/$line\>//g" $File1 >a.bak

                                sed "s/$line\>//g" $File2 >b.bak

                                rm $File1

                                rm $File2

                                mv a.bak $File1

                                mv b.bak $File2

                       fi

                     done <$File3

                 rm $File3 >/dev/null 2>&1

                 rm $File4 >/dev/null 2>&1

1.按照运行结果,编写一个名为xunhuan的shell过程

                                0

                               10

                              210

                             3210

                            43210

                           543210

                          6543210

                         76543210

                        876543210

           程序如下:

                      #!/bin/sh

                      #xunhuan

                      for(i=0;i<9;i++)

                         do

                            a=$i$a

                            echo $a

                         done

2.shell编程,实现一下功能:/tmp路径下有800个文件,文件名的格式:filename_YYYYMMDD_序列号((001-999)

.dat,例如:filename_20040108_089.dat,现在想把这些文件名改名,文件名为:file_TODAY(当前日期_序列号

(从500开始,到达999之后从001开始).dat,例如_089为_589,099为_599.

               #!/bin/sh

               DEST_FILE_PART2="_`date '+%Y%m%d'`_"

               EXT_NAME=".dat"

               SRC_FILE_LIST=`find /tmp -name "*_*_*$EXT_NAME" -print`

               for each in $SRC_FILE_LIST

                   do

                      DEST_FILE_PART1=`echo $each|awk -F_ '{print $1}'`

                      OLD_NUM=`echo $each|awk -F_ '{print $3}'|awk -F. '{print $1}'`

                      DEST_FILE_PART3=`expr $OLD_NUM + 500`

                      [ $DEST_FILE_PART3 -gt 999 ] && DEST_FILE_PART3=`expr $OLD_NUM - 499`

                       && DEST_FILE_PART3=`printf %03d $DEST_FILE_PART3`

                          DEST_FILE=$DEST_FILE_PART1$DEST_FILE_PART2$DEST_FILE_PART3

                       mv $each $DEST_FILE

                    done

3.设计一个shell程序,在/userdata目录下建立50个目录,即user1-user50,并设置每个目录的权限,其中其他

  用户的权限为:读;文件所有者的权限:读,写,执行;文件所有者:读,执行.

                   #!/bin/bah

                   #adddir.sh

                   i=1

                   while [ $i -le 50 ]

                      do

                        if [ -d /userdata ]

                        then

                            mkdir -p /userdata/user$i

                        else

                            mkdir /userdata

                            mkdir -p /userdata/user$i

                        fi

                    chmod 754 /userdata/user$i

                       i=$(($i+1))

                      done

4.编写shell程序,实现自动删除50个账号的功能,账号为stud1至stud50

                    #!/bin/sh

                    #deluser.sh

                    i=1

                    while [ $i -le 50 ]

                      do

                        if [ -n "`cat /etc/passwd|grep stud$i`" ]

                            then

                                userdel -r stdu$i

                             else

                                echo "No find stud$i"

                              i=$(($i + 1))

                             fi

                         done

5.打印1-99之间的奇数到文件

            方法一:

                    seq >newfile 1 2 99

            方法二:

                    #!/bin/bash

                    i=1

                    while [ $i -le 99 ]

                        do

                            if [ $i % 2 == 1 ]

                            then

                                echo "$i" >newfile

                            fi

                         done

6.将当前目录下的以数字开头的文件打包

              打包命令: tar -cvf 文件名 要打的文件(仅打包)

                        tar -zcvf 文件名 要打的文件(以gzip压缩)

              压缩命令: tar -zxvf 解压缩文件

              程序如下:

                   #!/bin/sh

                   #tar.sh

                   List=`ls -l|awk '{print $9}'|grep '^[0-9]'`

                   tar -cvf soft.tar $List

7.从a.log文件中提取包含"WARNING"或"FATAL",同时不包含"IGNOR"的行,然后提取以":"分割的第5个字段.

              grep -E 'WARNING|FATAL' file|grep -v 'IGNOR'|awk -F: '{print 5}'

1.有一个文件,里面有二列,第一列ip地址,第二列是时间,同一个ip可能出现多次,但时间不同.

   文件类似下面的样子:

              192.168.1.2              13:10

              192.127.12.1             13.11

              192.168.1.2              14:22

   现要求写一脚本,显示出现最多的ip top 10

          awk '{print $1}' file|sort|uniq -c|sort -nr|head -10

2.假设Apache产生的日志文件为access.log,在Apache正在运行的时候,执行命令mv access.log access.bak

  ,执行完毕后,请问新的apache日志会打印到那里?为什么?

   答: 新的日志会打印在access.bak中. 因为apache启动时,会找到access.log文件,随时准备向文件中追

       加日志,虽然此时文件被改名,但是由于服务正在运行,因为它的inode节点的位置没有变,程序打开的

       fd仍然会指向原来的那个inode.不会因为文件名的改变而改变,但若重启服务器之后,系统就会检查

       access.log文件是否存在,不存在,则创建.

3.在shell环境中,如何查看远程Linux系统运行了多少时间?

       ssh user@被监控的主机ip "uptime"|awk '{print $3,$4}'

4.处理一下文件内容,将域名取出并进行计数排数,如处理:

        http://www.baidu.com/index.html

        http://ww.baidu.com/1.html

        http://www.baidu.com/2.html

        http://post.baidu.com/index.html

        http://mp3.baidu.com/index.html

        http://www.baidu.com/3.html

        http://post.baidu.com/2.html

   得到如下结果:域名的出现次数,域名

                4     www.baidu.com

                2     post.baidu.com

                1     mp3.baidu.com

   shell程序如下:

        方法一: #cat file|sed -e 's/http:\/\///' -e 's/\/.*//'|sort|uniq -c|sort -nr|head -10

        方法二: #awk -F/  '{print $3}' file|sort -r|uniq -c|awk '{print $1 "\t",$2}'

5.如果得到随机的字串,长度和字串中出现的字符表可定义并将字串倒序显示,如把0123456789作为基准的

  字串字符表,产生一个6位的字串642031,打印出的字符串为130246,可使用bash/perl/php/c任一种。

          bash程序如下:

             #awk -v count=6 'BEGIN {srand();str="0123456789";len=length(str);for(i=count;i>0;

                     i--)marry[i]=substr(str,int(rand()*len),1);for(i=count;i>0;i--)printf(

                     "%c",marry[i]);printf("\n");for(i=0;i<=count;i++)printf("%c",marry[i]);

                     printf("\n")}'

             输出结果:838705

                       507838

6.如何查看当前Linux状态。如cpu使用,内存使用,负载情况等

      答:linux 中,"/proc"是个伪文件目录,不占用系统空间,及时反应出内存现在使用的进程情况

          其中许多文件都保存系统运行状态和相关信息。

          对于/proc可以浏览其文件内容:

              cpuinfo                   主机cpu信息

              filesystems               文件系统信息

              meninfo                   主机内存信息

              version                   Linux版本信息

              diskstatus                磁盘负载情况

           另外top命令可以动态的显示出当前系统进程用户的使用情况,free命令可以查看内存信息

           ps 查看进程情况。

7.比如,ext2文件系统,如果异常死机,开机如何修复文件系统?

       答:如果异常死机,如断电,通知机房的人开机之后,我们需要远程修复,检查文件系统。除了

            / 分区之外,其他分区:umount /home

                                  fsck -y /home

            / 分区需要开机之后由机房人员检查。随后我们登录并扫描/home分区

8.如何检查一个进程所使用的文件句柄?

       答:看这里面/proc/进程号/fd/ 的文件个数就行了

9.查看Apache的进程数。

        # ps -ef|grep httpd|wc -l

10.如何统计apache的每秒访问数?

        tail access_log|awk '{print $1,$4}'

       其中文件在:/etc/httpd/access_log

11.说明一下/proc/sys子目录的作用

        答:该子目录的作用是报告各种不同的内核参数,并让你能交互的更改其中某些。与/proc中所有

            其他文件不同,该目录中的某些文件可以写入,不过针对root。一下是该子目录的两个最常见

            的用途:

           (1)允许路由:即便是Mandrakelinux 默认的内核也是允许路由的。你必须显式允许它这么做

                为此:#echo 1 >/proc/sys/net/ipv4/ip_forward.

                如果您要禁用,则让上述1改为0

           (2)阻止ip欺骗:ip欺骗会让人认为某个来自于外部的某个数据包来自于它到达的那个接口,

                这一技术常被crack利用。你可以阻止这种入侵:

                      #echo 1 >/proc/sys/net/ipv4/conf/all/rp_filter.

                这次改变仅由系统运行时有效,系统重启后,会改变为默认值。你可以将以上命令添加到

                /etc/rc.d/rc.local中,启动就会运行。另一方法:修改/etc/sysctl.conf

1.有10台被监控主机,一台监控机,在监控机上编写脚本,一旦某台监控机器/分区使用率大于80%,就发出

  报警,放到crontab里面,每10分钟检查一次。

       (1)首先,建立信任关系 1 VS 10. 但拿两台机器(192.168.1.6,192.168.1.4)做试验

            #ssh-keggen -b 1024 -t rsa  //(以root用户)

            #cd .ssh/

            #ls

                  id_rsa

                  id_rsa.pub

                  knows_host

             #scp id_rsa.pub 192.168.1.4:/root/.ssh/192.168.1.6

              这里把公钥取名为可信任主机的IP地址

             现在登录到192.168.1.4机器

             #cd .ssh/

             #cat 192.168.1.6 >> authorized_keys

             然后回到192.168.1.6机器。

             #ssh 192.168.1.4

           这样就可以了,里面可能涉及到权限问题。一般.ssh/文件夹为755,authorized_keys 600或644

       (2)脚本如下:

             #!/bin/sh

             #script:df_check.sh

             FSMAX="80"

             remote_user='root'

             remote_ip=(192.168.1.2 192.168.1.3 192.168.1.4 .......)   //十个ip地址

             ip_num='0'

             while [ "$ip_num" -le "$(expr ${#remote_ip[@]} - 1)" ]

                 do

                    read_num='1'

                    ssh "$remote_user"@"${remote_ip[$ip_num]}" df -h >/tmp/diskcheck_tmp

                    grep '^/dev/*' /tmp/diskcheck_tmp|awk '{print $5}'|sed 's/\%//g' >

                              /tmp/diskcheck_tmp_num

                    while [ "$read_num" -le $(wc -l < /tmp/diskcheck_tmp_num)] //计算有多少行

                            do

                               size=$(sed -n "$read_num"'p' /tmp/diskcheck_tmp_num)

                               if [ "$size" -gt "$FSMAX" ]

                               then

                                  $(grep '^/dev/*' /tmp/diskcheck_tmp|sed -n $read_num'p' >

                                             /tmp/disk_mail)

                                  $(echo $(remote_ip[$ip_num]) >> /tmp/disk_mail)

                                  $(mail -s "diskcheck_alert" admin </tmp/disk_mail)

                               fi

                               read_num=$(expr $read_num + 1)

                             done

                             ip_num=$(expr $ip_num + 1)

                    done

         (3)放在crontab里面

            #######################################################################

            ################让脚本每十分钟执行一次#################################

            在cron表中:

                0/10 * * * * /home/codefei/diskcheck.sh 2>&1

2.自动ftp上传.

                   #!/bin/sh

                   ftp -n << END_FTP

                   open 192.168.0.102

                   user athos athosczx

                   binary

                   prompt off                       //关闭提示

                   mput test                       //上传test

                   close

                   bye

                   END_FTP

3.自动登录ssh.从A到B再到C

                   #!/usr/bin/expect -f

                   set timeout 30

                   spawn ssh athos@192.168.0.102

                   expect "password"

                   send "PPPPPPP\r"

                   expect "*]"

                   send "ssh athos@192.168.0.102"

                   expect "password:"

                   send "pppppppp\r"

                   interact

4.腾讯一shell试题.

            假设qq.tel文件内容:

              12334:13510014336

              12345:12334555666

              12334:12343453453

              12099:13598989899

              12334:12345454545

              12099:12343454544

            分类如下:

              [12334]

                  13510014336

                  12343453453

                  ...........

              [12099]

                  13598989899

                  12343454544

                  ............

          实现如下:

             cat qq.tel|sort|awk -F: '{if(tmp!=$1){tmp=$1;print "["tmp"]";}print "    $2";}"

 

 

分享到:
评论

相关推荐

    C/C++程序员面试指南.杨国祥(带详细书签).pdf

    面试题2:编码实现希尔(Shell)排序 11.2 交换排序 面试题3:编码实现冒泡排序 面试题4:编码实现快速排序 11.3 选择排序 面试题5:编码实现直接选择排序 面试题6:编程实现堆排序 11.4 基数排序 面试题7:编程实现...

    软件测试工程师面试题.md

    集合自身春招经验整理出的软件测试工程师的常见面试题,适合应届毕业生,内容主要是软件测试、shell脚本、Linux操作系统,包括软件测试基础知识、web测试基本方法、爬虫基础、Linux操作系统、微信小程序、shell脚本...

    Linux面试题的汇总

    就像任何其他典型的操作系统一样,Linux拥有所有这些组件:内核,shell和GUI,系统实用程序和应用 程序。Linux比其他操作系统更具优势的是每个方面都附带其他功能,所有代码都可以免费下载。 Linux 开机启动过程? 1...

    跟老男孩学Linux运维:Shell编程实战

    《跟老男孩学Linux运维:Shell编程实战》第五部分为第17章~第20章,着重讲解Linux信号及trap命令的企业应用实践、Expect自动化交互式程序的应用实践、贯穿全书技术的面试题和企业实战案例,以及子Shell知识。

    跟老男孩学Linux运维:Shell编程实战 part3

    本书可分为五大部分:第一部分为第1章~第4章,此...第五部分为第17章~第20章,着重讲解Linux信号及trap命令的企业应用实践、Expect自动化交互式程序的应用实践、贯穿全书技术的面试题和企业实战案例,以及子Shell知识。

    MySQL面试题,经典

    1、一张表,里面有 ID 自增主键,当 insert 了 17 条...15、Mysql 驱动程序是什么 16、TIMESTAMP 在 UPDATE CURRENT_TIMESTAMP 数据类型上做什么 17、主键和候选键有什么区别 18、如何使用 Unix shell 登录 Mysql ...

    跟老男孩学Linux运维:Shell编程实战.part2

    本书可分为五大部分:部分为第1章~第4章,此部分...第五部分为第17章~第20章,着重讲解Linux信号及trap命令的企业应用实践、Expect自动化交互式程序的应用实践、贯穿全书技术的面试题和企业实战案例,以及子Shell知识。

    跟老男孩学Linux运维:Shell编程实战.part1

    本书可分为五大部分:部分为第1章~第4章,此部分...第五部分为第17章~第20章,着重讲解Linux信号及trap命令的企业应用实践、Expect自动化交互式程序的应用实践、贯穿全书技术的面试题和企业实战案例,以及子Shell知识。

    跟老男孩学Linux运维:Shell编程实战 part5

    本书可分为五大部分:第一部分为第1章~第4章,此...第五部分为第17章~第20章,着重讲解Linux信号及trap命令的企业应用实践、Expect自动化交互式程序的应用实践、贯穿全书技术的面试题和企业实战案例,以及子Shell知识。

    跟老男孩学Linux运维:Shell编程实战 part1

    本书可分为五大部分:第一部分为第1章~第4章,此...第五部分为第17章~第20章,着重讲解Linux信号及trap命令的企业应用实践、Expect自动化交互式程序的应用实践、贯穿全书技术的面试题和企业实战案例,以及子Shell知识。

    跟老男孩学Linux运维:Shell编程实战 part4

    本书可分为五大部分:第一部分为第1章~第4章,此...第五部分为第17章~第20章,着重讲解Linux信号及trap命令的企业应用实践、Expect自动化交互式程序的应用实践、贯穿全书技术的面试题和企业实战案例,以及子Shell知识。

    跟老男孩学Linux运维:Shell编程实战 part2

    本书可分为五大部分:第一部分为第1章~第4章,此...第五部分为第17章~第20章,着重讲解Linux信号及trap命令的企业应用实践、Expect自动化交互式程序的应用实践、贯穿全书技术的面试题和企业实战案例,以及子Shell知识。

    linux C编程实战

     2.8 面试题选与实例精讲   2.8.1 面试题选   2.8.2 实例精讲   2.9 习题   第3章 C程序控制结构和gcc编译器   3.1 C程序的控制结构   3.1.1 C程序语句概述   3.1.2 C程序的3种基本控制结构...

    java开发笔试题面试题-starred::glowing_star:Maddison已加星标的回购,每日更新!

    java开发笔试题面试题真棒明星 我的 GitHub 星星的精选列表! 生成者 内容 动作脚本 - 具有 Flash 回退功能的 HTML5 网络摄像头图像捕获库 艾达 - C++ 和 Ada 的简单命令行参数解析器。 苹果脚本 - 一款 Mac 工具,...

    linuxC编程实战.part2.rar(文件已加密)

     2.8 面试题选与实例精讲   2.8.1 面试题选   2.8.2 实例精讲   2.9 习题   第3章 C程序控制结构和gcc编译器   3.1 C程序的控制结构   3.1.1 C程序语句概述   3.1.2 C程序的3种基本控制结构...

    linux C编程实战 电子书part2

     2.8 面试题选与实例精讲   2.8.1 面试题选   2.8.2 实例精讲   2.9 习题   第3章 C程序控制结构和gcc编译器   3.1 C程序的控制结构   3.1.1 C程序语句概述   3.1.2 C程序的3种基本控制结构...

    linux C编程实战 电子书part3

     2.8 面试题选与实例精讲   2.8.1 面试题选   2.8.2 实例精讲   2.9 习题   第3章 C程序控制结构和gcc编译器   3.1 C程序的控制结构   3.1.1 C程序语句概述   3.1.2 C程序的3种基本控制结构...

    linux C编程实战 电子书part4

     2.8 面试题选与实例精讲   2.8.1 面试题选   2.8.2 实例精讲   2.9 习题   第3章 C程序控制结构和gcc编译器   3.1 C程序的控制结构   3.1.1 C程序语句概述   3.1.2 C程序的3种基本控制结构...

Global site tag (gtag.js) - Google Analytics