Chinaunix首页 | 论坛 | 博客
  • 博客访问: 174544
  • 博文数量: 76
  • 博客积分: 3560
  • 博客等级: 中校
  • 技术积分: 860
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-17 13:02
文章存档

2011年(2)

2010年(41)

2009年(33)

我的朋友

分类: LINUX

2010-09-21 16:26:19

1.文本分析
取出password中shell出现的次数
第一种方法结果:
4 /bin/bash
1 /bin/sync
1 /sbin/halt
31 /sbin/nologin
1 /sbin/shutdown
第二种方法结果:
/bin/sync       1
/bin/bash       1
/sbin/nologin   30
/sbin/halt      1
/sbin/shutdown 1

2.文件整理
employee文件中记录了工号和姓名
employee.txt:
100 Jason Smith
200 John Doe
300 Sanjay Gupta
400 Ashok Sharma
bonus文件中记录工号和工资
bonus.txt:
100 $5,000
200 $500
300 $3,000
400 $1,250
要求把两个文件合并并输出如下
处理结果:
400 ashok sharma $1,250
100 jason smith $5,000
200 john doe $500
300 sanjay gupta $3,000
3.打印本机的交换分区大小
处理结果:
Swap:1024M
4.用户清理
清除本机除了当前登陆用户以外的所有用户
处理结果:
23:00:17 up 1:08, 1 user, load average: 0.02, 0.05, 0.02
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/1    192.168.1.100    22:15    0.00s 10.75s 0.00s w
本机只剩下你自己就对了:)
5.root用户今天登陆了多长时间
处理结果:
root logon today: 0.06 hour
6.打印当前sshd的端口和进程id
处理结果:
sshd Port&&pid: 22 5412
7.输出本机创建20000个目录所用的时间
处理结果:
real    0m3.367s
user    0m0.066s
sys     0m1.925s
8.打印root可以使用可执行文件数
处理结果:
root's bins: 2306


==============================
解法:

1.
第一种方法
awk -F ":" '{print $NF}' /etc/passwd | uniq -c
第二种方法
awk -F ":" '{print $NF}' /etc/passwd | uniq -c | awk '{print $2, $1}'

2. join employee bonus | sort -k 2

3. free -m | grep '[s|S]wap' | awk '{print $2}'
or
free -m | sed -n '/Swap/p' | awk '{ print $2}'
or
free -m | sed -n 's/Swap:\ *\([0-9]*\).*/\1/p'

6. netstat -anp | grep sshd | sed -n 's/.*:::\([0-9]*\)\ .* \ \([0-9]*\)\/sshd/\1 \2/p'

7. # time for i in {1..2000} ; do mkdir /root/neil$i; done

8.
echo "root's bins: $(find ./ -type f | xargs ls -l | sed '/-..x/p' | wc -l)"
 

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

程序实现及注释如下:

#! /bin/bash
#deluser.sh

#考察while循环

i=1
while [ $i -le 50]
do
#查看账户是否存在:只需要在/etc/passwd文件查找就可以了。我是利用了一个管道符,再利用grep进行查#找;存在就删除,不存在给出提示。
#具体含义如下:
cat /etc/passwd 把passwd的内容打印到标准输出上(显示器上)但有了管道符以后。passwd的内容就不

#打印到标准输出上了,就直接转到了下一个命令的标准输入里。那么grep  stud$i,就从标准输入里进行

#查找了。

if [ -n "`cat /etc/passwd | grep stud$i`" ]
then
 userdel -r stdu$i
else
 echo "No find stdu$i"
i=$(($i+1))
done

#本题目考察到while、if语句、test命令等知识。难点在于要删除的用户是否存在我们需要自己判断。

#其实只要我们对grep或正则表达式学过一点就能写出来。大家多练练,下次碰到类似的题目就没有问题

#了。

设计一个Shell程序,在/userdata目录下建立50个目录,即user1~user50,并设置每个目录的权限,其中其他用户的权限为:读;文件所有者的权限为:读、写、执行;文件所有者所在组的权限为:读、执行。

程序实现及注释如下:

#! /bin/bash
#adddir.sh
i=1
#while循环
while [ $i -le 50 ]
do
#利用 test命令 [ -d /userdata ]:判断/userdata是否存在,如果存在直接创建子目录,不#存在先创建/userdata再创建子目录。

if [ -d /userdata ]
then
#mkdir -p的意思是:无论父目录/userdata存在与否,都会创建/userdata/user$i
 mkdir -p /userdata/user$i 
else
 mkdir  /userdata
 mkdir -p /userdata/user$i
fi
#根据题目的意思:/userdata/user$i应该是具有754权限,所以利用chmod赋权限。

chmod  754 /userdata/user$i
i=$(($i+1))
done

用Shell编程,判断一文件是不是字符设备文件,如果是将其拷贝到 /dev 目录下。

程序实现以及注释如下:

#! /bin/bash
#cp.sh

#shell脚本的第一行是必须按照上面那种格式写,因为它表示的含义是
#当前的shell脚本使用/bin/bash处理;第二行一般写脚本的文件名。

#1.echo 在屏幕上输出后面的字符串,和C的printf功能一样。

echo  -e "please input filename \n"

#2.判断是那个文件?可以使用read命令从键盘上获取文件名。

read FILENAME

#3.如何判断是否是字符设备,3.1.这个就要使用到Test命令。而Test命令都是系统内置的,我们记住了,

#使用就可以了。其中有[ -c FILENAME ]这个命令就是判断FILENAME是否是字符设备,如果是为真;如果不是为假;
#3.2.这个程序中有如果...就....的问题,所以要用到if语句.但shell所用的if的语法和以前所学的C不

#一样,但完成的功能一样。if [ ... ]; then  fi

if[ -c $FILENAME ]
then
    cp $FILENAME /dev
else
    echo "It's not Charactor device file"
fi

#这个题目考察到了Shell的语法格式,以及read、if、test命令。特别test命令可以测试文件状态,可以测

#试数值大小,也可以比较字符串。所以我们以后if、while、for、until所用到条件都会使用到test命令。

#其实shell编程的面试不难,大家加油哈!


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/djbtestingsky/archive/2009/02/20/3915592.aspx

 

要求分析apache访问日志,找出访问页面数量在前100位的IP数。日志大小在78M左右。以下是apache的访问日志节选,相信大家都不陌生

  1. 202.101.129.218 - - [26/Mar/2006:23:59:55 +0800] "GET /online/stat_inst.php?pid=d065 HTTP/1.1" 302 20-"-" "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
  2. 218.107.27.137 - - [26/Mar/2006:23:59:56 +0800] "GET /online/stat_inst.php?pid=0000 HTTP/1.1" 302 20-"-" "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)"
  3. 218.6.249.115 - - [26/Mar/2006:23:59:56 +0800] "GET /online/stat_inst.php?pid=d072 HTTP/1.1" 302 20-"-" "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
  4. 58.63.148.135 - - [26/Mar/2006:23:59:56 +0800] "GET /online/help.php?id=101&ver=5.1.4.174&url=aHR0cDovL2NuYy1odHRwLnhwYm9vay5jb206ODEvMjA1MDQvy7y/xsjP1qRjY25hytPGtb3Ms8wxLTIwyKsudG9ycmVudA== HTTP/1.1" 200 1068-"48" "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)"
  5. 218.80.29.87 - - [26/Mar/2006:23:59:56 +0800] "GET /online/help.php?id=303&ver=5.1.5.189&url=cnRzcDovL2ZpbG0uMDUxOHFxLmNvbS9hbGxlbi9zb2xhLnJtdmI= HTTP/1.1" 200 960-"47" "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.1; .NET CLR 1.1.4322)"
  6. 221.235.61.109 - - [26/Mar/2006:23:59:57 +0800] "GET /online/stat_inst.php?pid=0000 HTTP/1.1" 302 20-"-" "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)"
  7. 222.218.90.239 - - [26/Mar/2006:23:59:57 +0800] "GET /online/stat_inst.php?pid=0000 HTTP/1.1" 302 20-"-" "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"
  8. 218.18.86.47 - - [26/Mar/2006:23:59:57 +0800] "GET /online/stat_inst.php?pid=0000 HTTP/1.1" 302 20-"-" "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"
  9. 218.13.157.216 - - [26/Mar/2006:23:59:57 +0800] "GET /online/stat_inst.php?pid=0000 HTTP/1.1" 302 20-"-" "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
  10. 218.80.151.85 - - [26/Mar/2006:23:59:57 +0800] "GET /online/stat_inst.php?pid=a005 HTTP/1.1" 302 20-"-" "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"
  11. 218.76.155.98 - - [26/Mar/2006:23:59:57 +0800] "GET /online/stat_inst.php?pid=0000 HTTP/1.1" 302 20-"-" "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"
  12. 221.7.249.206 - - [26/Mar/2006:23:59:57 +0800] "GET /error/error.php?ver=5.0.3.86&code=0 HTTP/1.1" 200 6886-"-" "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; TencentTraveler )"
  13. 219.129.183.122 - - [26/Mar/2006:23:59:57 +0800] "GET /online/stat_inst.php?pid=0000 HTTP/1.1" 302 20-"-" "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)"
  14. 218.85.121.146 - - [26/Mar/2006:23:59:57 +0800] "GET /online/stat_inst.php?pid=0000 HTTP/1.1" 302 20-"-" "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)"
  15. 221.237.232.191 - - [26/Mar/2006:23:59:57 +0800] "GET /online/stat_inst.php?pid=0000 HTTP/1.1" 302 20-"-" "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"
  16. 222.182.95.155 - - [26/Mar/2006:23:59:58 +0800] "GET /online/stat_inst.php?pid=0000 HTTP/1.1" 302 20-"-" "-" "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"
  17. 222.90.66.142 - - [26/Mar/2006:23:59:58 +0800] "GET /online/stat_inst.php?pid=0000 HTTP/1.1" 302 20-"-" "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Maxthon)"
  18. 221.233.19.137 - - [26/Mar/2006:23:59:58 +0800] "GET /online/stat_inst.php?pid=d012 HTTP/1.1" 302 20-"-" "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"
  19. 221.224.78.15 - - [26/Mar/2006:23:59:59 +0800] "GET /online/stat_inst.php?pid=0000 HTTP/1.1" 302 20-"-" "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
复制代码





下面是我个人的shell脚本,虽然实现了,但是效率及其低下,看大家有没有更好的思路。

  1. #!/bin/bash
  2. # 先找出唯一的IP
  3. cat access_help.aaa.log.20060326 |awk '{print $1}'|uniq > ip.txt

  4. # 再用唯一的IP去日志里面计算出现的次数,再用sort排列
  5. while read IP
  6.         do
  7.                 COUNT=`cat access_help.aaa.log.20060326 |grep $IP|wc -l`
  8.                 echo $COUNT:$IP >> count.txt
  9.         done < ip.txt

  10. cat count.txt|sort -n -r|head -100 > top100.txt
  11. echo "" > count.txt

shell程序面试题(四)

(2009-09-17 23:18:38)
标签:

it

杂谈

分类: Bash脚本(Redhat)

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.处理一下文件内容,将域名取出并进行计数排数,如处理:

       

        

       

       

       

       

       

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

                  

                   post.baidu.com

                   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

 
阅读(738) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~