shell脚本编程-系统工程师面试题

1.从 a.log 文件中提取包含“WARNING”或”FATAL”,同时不包含“IGNOR”的行,然后,提取以“:”分割的第五个字段?

[php]
grep -E ‘WARNING|FATAL’ a.log | grep-v’IGNOR’ | awk -F : ’{print $5 }’
[/php]

2.添加一个新组为class01,然后,添加属于这个组的30个用户,用户名的形式为stdXX,其中,XX从 01到 30?

[php]
#!/bin/bash
groupadd class01
for((i=1;i<=9;i++))
do
useradd std0$i -G class01
done

for((i=10;i<=30;i++))
do
useradd std$i -G class01
done</div>
[/php]



3.在每个月的第一天备份并压缩/etc目录下的所有内容,存放在/root/backup目录里,且文件名为如下形式yymmdd_etc,yy为年,mm为月,dd为日。shell程序 fileback存放在/usr/bin 目录下?

[php]
tar -zcf /root/backup/`date+%y%m%d`_etc /etc
[/php]

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

[php]
#!/bin/bash
if test$# -ne1
then
echo ”ERROR”
exit 1
fi
if test -c $1
then
/bin/cp -a $1 /dev/
exit0
fi
exit 1</div>
[/php]

5.某系统管理员需要每天做一定的重复工作,编制一个解决方案:
(1).从下午 4:50 删除/abc 目录下的全部子目录和全部文件;
(2).从早上 8:00~下午 6:00每小时读取/xyz目录下x1 文件中每行第一个域的全部数据加入到/backup目录下的 back01.txt文件内;
(3).每逢周一下午 5:50 将/data目录下的所有目录和文件归档并压缩为文件backup.tar.gz;
(4).在下午 5:55 将IDE接口的CD-ROM缷载(假设CD-ROM的设备名为 hdc);
(5).在早上 8:00 开机后启动。

使用计划任务来完成:

crontab-e
———————–
50 16 * * * rm-rf/abc/*
00 08-18 * * * awk ‘{print$1 }’ /xyz/x1 >> /backup/back01.txt
50 17 * * 01 tar-zcf/backup/backup.tar.gz /data
55 17 * * * umount/dev/hdc

———————–
设定BIOS每日上午 08:00开机


1. 现有qq.tel文件

12334:13510014336
12345:12334555666
12334:12343453453
12099:13598989899
12334:12345454545
12099:12343454544

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

输出如下

[12099]
12343454544
13598989899
[12334]
12343453453
12345454545
13510014336
[12345]
12334555666

2. 查看apache进程数, perfork模式:ps -ef | grep httpd | grep -v grep| wc -l

worker模式:  pstree -a|grep httpd | wc -l

3. 处理以下文件内容,将域名取出并进行计数排序,如处理

oldboy.log

http://www.etiantian.org/index.html

http://www.etiantian.org/1.html

http://post.etiantian.org/index.html

http://mp3.etiantian.org/index.html

http://www.etiantian.org/3.html

http://post.etiantian.org/2.html

cat old.log | awk -F / '{print $3}' | sort -u

4. shell命令统计排序网站域名的访问量

cat access.log | awk '{split($7, D, "/"); ++A[D[3]]} END {for(key in A) printf("%10d %s\n", A[key], key)}' | sort -nr | head -n 10

将前面log中文件按“空格”或“制表符”分割,然后再以“/”分割第7个域,存入数组“D”中,这个域应该是网址,网址的格式一般是“http://zhidao.baidu.com/question/210746146.html”,所以以“/”分割后得到的第三个域 D[3] 就是“zhidao.baidu.com”,将这个字符串作为 key 存入数组 A 中并且遇到相同的字符串时,A[key] 就加1,这样在awk 的END 段遍历数组A 就可以得到 key 和 key的计数(A[key]) 了,下一个“|”后面跟的命令 sort -nr 是指 按自然数大小(-n)和反序(-r) 排列,最后个“|”后面跟的命令 head 就是看输出的前10行
[root@xen195v /var/log/nginx]# cat access.log
1 1 1 1 1 1 http://www.baidu.com/hubo?dfde&deadf
1 1 1 1 1 1 http://www.sina.com/hubo?dfde&deadf
1 1 1 1 1 1 http://www.baidu.com/hubo?dfde&deadf
1 1 1 1 1 1 http://www.360.cn/hubo?dfde&deadf
1 1 1 1 1 1 http://www.baidu.com/hubo?dfde&deadf

执行shell命令后

www.baidu.com
www.sina.com
www.360.cn

5. 写脚本实现,可以用shell、perl等。在目录/var/log/nginx下找到100个包含log的文件,然后把这些文件的第一行保存到文件new中

[php]
#!/bin/sh
for filename in `find /var/log/nginx -type f -name "*log*"|head -n 100`
do
sed -n '1p' $filename>>new
done
[/php]

6.

cat cu1.txt
aaa
ddd
aaa
bbb
ccc
ccc
ddd
fff
aaa
ddd
ccc
ee
要求打印重复超过3次的行?
cat cu1.txt | awk '++a[$1] >=3 {print $0}'

参考http://man.lupaworld.com/content/manage/ringkee/awk.htm
$n当前记录的第n个字段,字段间由FS分隔。$0完整的输入记录。

7. shell脚本的题目,如下:
一个文本类型的文件,里面每行存放一个登陆者的IP(某些行是重复的),写一个shell脚本输出登陆次数最多的用户。
cat ip_input | uniq -c | sort | tail -1 | awk -F '{print $2}'

8. shell重定向与管道 (漏斗)
以<改变标准输入 program < file
以>改变标准输出 program > file
以>>附加到文件 program >> file  将程序的标准输出附加到文件的结尾
标准输入(standard input)的文件描述符是 0
标准输出(standard output)是 1
标准错误(standard error)是 2

1> 指标准信息输出路径(也就是默认的输出方式)
2> 指错误信息输出路径
2>&1 指将标准信息输出路径指定为错误信息输出路径(也就是都输出在一起)

grep "standard"* > grep.out 2>&1
指的是将包含"standard" 的行全部写入grep.out文件中,包括grep时发生错误的报错信息


一、取出/etc/passwd文件中shell出现的次数
问题:下面是一个/etc/passwd文件的部分内容。题目要求取出shell并统计次数,shell是指后面的/bin/bash,/sbin/nologin等,如下面/bin/bash出现12次,/sbin/nologin出现3次。

hyn:x:525:500::/home/hyn:/bin/bash
ljlxx:x:526:500::/home/ljlxx:/bin/bash
lzj:x:527:500::/home/lzj:/bin/bash
wfly:x:528:500::/home/wfly:/bin/bash
squid:x:23:23::/var/spool/squid:/sbin/nologin
wyj:x:529:500::/home/wyj:/bin/bash
qemu:x:107:107:qemu user:/:/sbin/nologin
radvd:x:75:75:radvd user:/:/sbin/nologin
dungbee:x:530:500::/home/dungbee:/bin/bash
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
scidb:x:531:531::/home/scidb:/bin/bash
postgres:x:532:532::/home/postgres:/bin/bash
crane:x:533:533::/home/crane:/bin/bash
test:x:534:534::/home/test:/bin/bash
hguser:x:535:535::/home/hguser:/bin/bash

参考答案:

cat /etc/passwd|awk -F: '{print $7}'|sort|uniq -c

解析:
使用awk根据冒号分割内容,打印输出分割后的第7列,也就是shell所在列。然后调用sort命令排序并使用uniq -c统计每个shell出现的次数。

二、文件整理
问题:
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

参考答案:

paste employee.txt bonus.txt | awk '{print $1,$2,$3,$5}'|tr '[:upper:]' '[:lower:]'|sort -k 2

解析:
这里用到好几个命令,包括paste,awk,tr以及sort。paste命令用于合并多个文件的同行数据,如上面两个文件employee和bonus调用paste后合并成

100 Jason Smith   100 $5,000
200 John Doe   200 $500
300 Sanjay Gupta   300 $3,000
400 Ashok Sharma   400 $1,250

paste命令可以使用-d指定合并时加入的符号。比如paste -d : employee bonus则结果变成类似100 Jason Smith :100 $5,000 等。默认合并符号为tab符号,更多paste命令请参照http://snailwarrior.blog.51cto.com/680306/144462/
awk用于提取除了tab符号的其余4列。
tr命令用于将字符串中所有大写字符转换为小写字符。更多选项参见http://www.huanxiangwu.com/238/linux-tr%E5%91%BD%E4%BB%A4%E8%AF%A6%E8%A7%A3
sort命令对字符排序。sort -k 2表示按文件第2个域排序,这里第二个域为姓名,所以是按姓名升序排序。如果要降序排列,则要用sort -k 2r。更多sort命令参见http://www.360doc.com/content/10/0925/15/1107705_56263541.shtml

三、打印本机交换分区大小
问题:打印本机交换分区大小,输出如下

Swap:1024M

参考答案:

top -n 1|grep Swap|sed 's/k.*//'|awk '{print $1,$2/1000"M"}'

解析:
top 命令显示系统资源占用情况,-n 1表示只调用1次。
grep Swap选取Swap所在行。grep命令执行后结果可能如下:

Swap: 16779884k total, 0k used, 16779884k free, 3268200k cached

sed命令用于字符串的一些正则匹配,这里使用了替换参数,将第1个k以及后面的字符替换成了空白。这样,sed执行后,结果为:

Swap: 16779884

awk命令输出内容,对第二个参数除以1000.

四、用户清理
问题:清除本机除了当前登陆用户以外的所有用户。
参考答案:

kill $(who -u|grep -v `whoami`|awk '{print $6}'|sort -u)

解析:
who -u显示所有当前用户。grep -v选取当前登录用户以外的所有用户。awk打印用户进程ID。sort -u会删除相同的行。最后用kill命令终止。

五、百度脚本面试题
1)写脚本实现,可以用shell、perl等。在目录/tmp下找到100个以abc开头的文件,然后把这些文件的第一行保存到文件new中。
参考答案1:

#!/bin/sh
for filename in `find /tmp -type f -name "abc*"|head -n 100`
do
sed -n '1p' $filename>>new
done

解析:第一,用到了find命令,其中-type f表示选取普通文件,-name用于设定文件名;第二,head -n 100命令用于取出前100项。第三,sed -n ’1p’用于取出文件的第一行内容。第四,>>new表示追加到文件new中。
参考答案2:

find /tmp -type f -name “abc*” | head -n 100 | xargs head -q -n 1 >> new

2)写脚本实现,可以用shell、perl等。把文件b中有的,但是文件a中没有的所有行,保存为文件c,并统计c的行数。

参考答案:

grep -vxFf a b | tee c | wc -l

解析:grep选取-v表示不选择匹配的行,-F表示匹配的模式按行分割,-f a表示匹配模式来自文件a,最后表示目标文件b。即grep命令从b中选取a中不存在的行。
tee c命令创建文件c,wc -l命令统计行数。


shell脚本编程部分:
1.从a.log文件中提取包含“WARNING”或”FATAL”,同时不包含“IGNOR”的行,然后,提取以“:”分割的第五个字段?
2.添加一个新组为class01,然后,添加属于这个组的30个用户,用户名的形式为stdXX, 其中,XX从01到30?
3.在每个月的第一天备份并压缩/etc目录下的所有内容,存放在/root/backup目录里,且文件名为如下形式yymmdd_etc,yy为年,mm为月,dd为日。shell程序fileback存放在/usr/bin目录下?
4.用shell编程,判断一文件是不是字符设备文件,如果是将其拷贝到/dev目录下?
参考答案:
#!/bin/bash
directory=/dev
for file in anaconda-ks.cfg install.log install.log.syslog
do  if [ -f $file ]
then  cp $file $directory/$file.bak
echo " HI, $LOGNAME $file is backed up already in $directory !!"
fi  done
5.某系统管理员需要每天做一定的重复工作,编制一个解决方案:
(1).从下午4:50删除/abc目录下的全部子目录和全部文件;
(2).从早上8:00~下午6:00每小时读取/xyz目录下x1文件中每行第一个域的全部数据加入到/backup目录下的back01.txt文件内;
(3).每逢周一下午5:50将/data目录下的所有目录和文件归档并压缩为文件backup.tar.gz;
(4).在下午5:55将IDE接口的CD-ROM缷载(假设CD-ROM的设备名为hdc);
(5).在早上8:00前开机后启动。
---------------------------------------------------------
1、简述Apache两种工作模式,以及它们之间的区别。
答案:最主要的两种模式是prefork模式与worker模式。prefork每个子进程只有一个线程,效率高但消耗内存大,是unix下默认的模式;worker模式每个子进程有多个线程,内存消耗低,但一个线程崩溃会牵连其它同子进程的线程。
2、用iptables添加一个规则允许192.168.0.123访问本机3306端口
iptables -I INPUT 1 -p tcp -m tcp --dport 3306 -s 192.168.0.123 -j ACCEPT
3、如何对一台Linux服务器进行系统性能调优,列举出参数。
4、DNS服务器的工作原理。
5、修改第一块网卡的路径是什么。
/etc/sysconfig/network-scripts/ifcfg-eth0
6、用awk。。。具体题目记不清了,考的是awk脚本编程。
7、使用shell,建立class1用户组,再批量建立stu1--stu30的用户,并指定用户组为class1。
vi autoaddusr
#!/usr/bin/php -q
exec("groupadd class1");
for($i=1; $i<=30; $i++){
exec("useradd -G class1 stu".$i);
}  ?>  chmod +x autoaddusr
./autoaddusr
8、个人对该工作的未来如何规划,需要加强哪些能力。
首先,我有一颗真诚的心,遇事沉着冷静,不急不躁;
其次,我有相应的专业知识和工作经验。一年多的系统管理经历锻炼了我在这个行业的业务能力,并对行业前景和发展动态有相应的了解;
最后,我会用踏实的作风在今后的工作中证明我自己的能力!
9、日常监控都需要监控哪些?
1)硬件:
CPU:/proc/cpuinfo
内存:/proc/meminfo
硬盘:fdisk -l
2)系统:
负载:/proc/loadavg
uptime查看实时load average、swap
虚拟内存:vmstat(参数-s;2 4)
SUID,用户,进程
系统日志:tail -f /var/log/messages
logwatch --print --range Today --service SSHD --service pam_unix
3)网络:Host_Alive,Ping,端口,连接
----------------------------------------------------
1.如何将本地80端口的请求转发到8080端口,当前主机IP为192.168.16.1,其中本地网卡eth0:
答:  #iptables -t nat -A PREROUTING -d 192.168.16.1 -p tcp --dport 80 -j DNAT --to 192.168.16.1:8080
或者:
#iptables -t nat -A PREROUTING -i eth0 -d 192.168.16.1 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
2.什么是NAT,常见分为那几种,DNAT与SNAT有什么不同,应用事例有那些?
3.包过滤防火墙与代理应用防火墙有什么区别,能列举几种相应的产品吗?
4.iptables是否支持time时间控制用户行为,如有请写出具体操作步骤
5.说出你知道的几种linux/unix发行版本
6.列出linux常见打包工具并写相应解压缩参数(至少三种)
7.计划每星期天早8点服务器定时重启,如何实现?
8.列出作为完整邮件系统的软件,至少二类
9,当用户在浏览器当中输入一个网g站,说说计算机对dns解释经过那些流程?注:本机跟本地dns还没有缓存。
答: a.用户输入网址到浏览器
b.浏览器发出DNS请求信息
c.计算机首先查询本机HOST文件,看是否存在,存在直接返回结果,不存在,继续下一步
d.计算机按照本地DNS的顺序,向合法dns服务器查询IP结果,
e.合法dns返回dns结果给本地dns,本地dns并缓存本结果,直到TTL过期,才再次查询此结果
f.返回IP结果给浏览器
g.浏览器根据IP信息,获取页面
10,我们都知道,dns既采用了tcp协议,又采用了udp协议,什么时候采用tcp协议?什么时候采用udp协议?为什么要这么设计?
答:这个题需要理解的东西比较的多,分一下几个方面
a,从数据包大小上分:UDP的最大包长度是65507个字节,响应dns查询的时候数据包长度超过512个字节,而返回的只要前512个字节,这时名字解释器通常使用TCP从发原来的请求。
b,从协议本身来分:大部分的情况下使用UDP协议,大家都知道UDP协议是一种不可靠的协议,dns不像其它的使用UDP的Internet应用 (如:TFTP,BOOTP和SNMP等),大部分集中在局域网,dns查询和响应需要经过广域网,分组丢失和往返时间的不确定性在广域网比局域网上更大,这就要求dns客户端需要好的重传和超时算法,这时候使用TCP
11,一个EXT3的文件分区,当使用touch test.file命令创建一个新文件时报错,报错的信息是提示磁盘已满,但是采用df -h命令查看磁盘大小时,只使用了,60%的磁盘空间,为什么会出现这个情况,说说你的理由。
答:两种情况,一种是磁盘配额问题,另外一种就是EXT3文件系统的设计不适合很多小文件跟大文件的一种文件格式,出现很多小文件时,容易导致inode耗尽了。
12,我们都知道FTP协议有两种工作模式,说说它们的大概的一个工作流程?
FTP两种工作模式:主动模式(Active FTP)和被动模式(Passive FTP)
在主动模式下,FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,然后开放N+1号端口进行监听,并向服务器发出PORT N+1命令。
服务器接收到命令后,会用其本地的FTP数据端口(通常是20)来连接客户端指定的端口N+1,进行数据传输。
在被动模式下,FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,同时会开启N+1号端口。然后向服务器发送PASV命令,通知服务器自己处于被动模式。服务器收到命令后,会开放一个大于1024的端口P进行监听,然后用PORT P命令通知客户端,自己的数据端口是P。客户端收到命令后,会通过
N+1号端口连接服务器的端口P,然后在两个端口之间进行数据传输。
总的来说,主动模式的FTP是指服务器主动连接客户端的数据端口,被动模式的FTP是指服务器被动地等待客户端连接自己的数据端口。
被动模式的FTP通常用在处于防火墙之后的FTP客户访问外界FTp服务器的情况,因为在这种情况下,防火墙通常配置为不允许外界访问防火墙之
后主机,而只允许由防火墙之后的主机发起的连接请求通过。
因此,在这种情况下不能使用主动模式的FTP传输,而被动模式的FTP可以良好的工作。
13.编写个shell脚本将当前目录下大于10K的文件转移到/tmp目录下

[php]
#/bin/sh
#Programm :
# Using for move currently directory to /tmp
for FileName in `ls -l |awk '$5>10240 {print $9}'`
do  mv $FileName /tmp
done  ls -al /tmp
echo "Done! "

[/php]

14.apache有几种工作模式,分别介绍下其特点,并说明什么情况下采用不同的工作模式?
apache主要有两种工作模式:prefork(apache的默认安装模式)和worker(可以在编译的时候加参数--with-mpm-worker选择工作模式)
prefork的特点是:(预派生)
1.这种模式可以不必在请求到来时再产生新的进程,从而减小了系统开销
2.可以防止意外的内存泄漏
3.在服务器负载下降的时候会自动减少子进程数
worker的特点是:支持混合的多线程多进程的多路处理模块
如果对于一个高流量的HTTP服务器,worker MPM是一个比较好的选择,因为worker MPM占用的内存要比prefork要小。
15.名词解释 HDLC,VTP,OSPF,RIP,DDOS,system V,GNU,netscreen,ssh,smartd,apache,WAIT_TIME 等等
16.编写shell脚本获取本机的网络地址。比如:本机的ip地址是:192.168.100.2/255.255.255.0,那么它的网络地址是
192.168.100.1/255.255.255.0
方法一:
1. #!/bin/bash
2. #This script print ip and network
3. file="/etc/sysconfig/network-scripts/ifcfg-eth0"
4. if [ -f $file ] ;then
5. IP=`grep "IPADDR" $file|awk -F"=" '{ print $2 }'`
6. MASK=`grep "NETMASK" $file|awk -F"=" '{ print $2 }'`
7. echo "$IP/$MASK"
8. exit 1
9. fi
方法二:
1. #!/bin/bash
2. #This programm will printf ip/network
3. #  4. IP=`ifconfig eth0 |grep 'inet ' |sed 's/^.*addr://g'|sed 's/ Bcast.*$//g'`
5. NETMASK=`ifconfig eth0 |grep 'inet '|sed 's/^.*Mask://g'`
6. echo "$IP/$NETMASK"
7. exit
17.在命令行下发一邮件,发件人:123@abc.com,收信人:abc@xyz.com
二简述题:
1.linux下如何改IP,主机名,DNS
2.linux下如何添加路由
3.简述linux下编译内核的意义与步骤
4.简述Linux启动过程
5.简述DDOS攻击的原理
6.简述Tcp三次握手的过程
7.简述VPN,常见有哪几种?
8.  三:设计题:
1.系统设计
请考虑以下系统的设计. 您可以翻阅资料,查询任何您有帮助的资料、指南等。
您有的资源:
8台安装Linux (2.6内核) 的双网卡PC服务器以及相关开源软件,交换机
Apache 2.2.x
Tomcat 5.5.X
数据库系统
最多8个Internet IP地址,请您设计一个系统:
1、使用双apache web server前端;
2、采用AJP连接后段的3台Tomcat应用服务器,这些tomcat被配置成cluster, 因此需要考虑apache对后端的分配, 分配采用完全平衡的方法
; 配置使用cookie来实现session stickness;
3、1台数据库服务器只有tomcat才需要连接,也不需要对Internet提供服务。
4、考虑系统的安全性和维护方便性;
5、通过rewrite规则配置把下属URL规则改写成友好的URL
http://server/webapp/getinfo?id=XXXX&name=YYYY –> http://server/getinfo/YYYY/XXXX
您需要提交
1、服务器规划,包括:
* 网络结构图
* 每台机器的IP地址分配
* 每台机器上运行的关键软件
* 您从安全性和维护性方面的考虑
2、Apache的以下配置文件给我们:
* extra/http-proxy-ajp.conf
* extra/http-rewrite.conf
2.你可以采取任何设备和不同操作系统服务器设计对两台WWW服务器和两台FTP服务器做负载均衡,用网络拓扑图表示并加以说明!(方法越多
越好)
第一种方法: DNS轮巡
www1 IN A 192.168.1.1
www2 IN A 192.168.1.2
www3 IN A 192.168.1.3
ftp1 IN A 192.1.1.4
ftp2 IN A 192.1.1.5
ftp3 IN A 192.1.1.6
www IN CNAME www1
www IN CNAME www2
www IN CNAME www3
ftp IN CNAME ftp1
ftp IN CNAME ftp2
ftp IN CNAME ftp3

还没有评论,快来抢沙发!

发表评论

  • 😉
  • 😐
  • 😡
  • 😈
  • 🙂
  • 😯
  • 🙁
  • 🙄
  • 😛
  • 😳
  • 😮
  • emoji-mrgree
  • 😆
  • 💡
  • 😀
  • 👿
  • 😥
  • 😎
  • ➡
  • 😕
  • ❓
  • ❗
  • 65 queries in 0.407 seconds