您的位置:首页 > 职场人生

Shell 面试题

2019-03-18 16:10 16 查看

一道腾讯面试题:一个文本类型的文件,里面每行存放一个登陆者的 IP(某些行是重复的),
写一个 shell 脚本输出登陆次数最多的用户。
Ip_input.txt 的内容假设如下:
219.217.49.14
175.43.4.87
87.48.98.1
59.73.38.25
219.217.50.14
59.92.48.32
219.217.49.14
59.72.38.142
59.73.38.25
219.217.49.14
#! /bin/bash

test.sh

sort ip_input | uniq -c | sort | tail -1 | awk ‘{print $2}’ 或者:
sort ip_input | uniq -c | sort -r | head -1 | awk '{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 2}̲' uniq -c 选项。它的…FILENAME" ]
then
cp $FILENAME /dev
fi
2.请为下列 shell 程序添加注释,并说明程序的功能和调用方法:#!/bin/sh
#!/bin/sh

/etc/rc.d/rc.httpd

Start/stop/restart the Apache web server.

To make Apache start automatically at boot, make this

file executable: chmod 755 /etc/rc.d/rc.httpd#

case “$1” in
‘start’)
/usr/sbin/apachectl start ;;
‘stop’)
/usr/sbin/apachectl stop ;;
‘restart’)
/usr/sbin/apachectl restart ;;
*)
echo “usage $0 start|stop|restart” ;;
esac
参考答案:
(1)程序注释
#!/bin/sh 定义实用的 shell

/etc/rc.d/rc.httpd 注释行,凡是以星号开始的行均为注释行。

Start/stop/restart the Apache web server.

To make Apache start automatically at boot, make this

file executable: chmod 755 /etc/rc.d/rc.httpd

case “$1” in #case 结构开始,判断“位置参数”决定执行的操作。本程序携带一个“位置参数”,即$1
‘start’) #若位置参数为 start
/usr/sbin/apachectl start ;; #启动 httpd 进程
‘stop’) #若位置参数为 stop
/usr/sbin/apachectl stop ;; #关闭 httpd 进程
‘restart’) #若位置参数为 stop
/usr/sbin/apachectl restart ;; #重新启动 httpd 进程
) #若位置参数不是 start、stop 或 restart 时
echo “usage $0 start|stop|restart” ;; #显示命令提示信息:程序的调用方法
esac #case 结构结束
(2)程序的功能是启动,停止或重新启动 httpd 进程
(3)程序的调用方式有三种:启动,停止和重新启动。
3.设计一个 shell 程序,添加一个新组为 class1,然后添加属于这个组的 30 个用户,用户名的形式为 stdxx,
其中 xx 从 01 到 30。
参考答案:
#!/bin/sh
i=1
groupadd class1
while [ $i -le 30 ]
do
if [ i−le9];thenUSERNAME=stu0i -le 9 ] ;then USERNAME=stu0i−le9];thenUSERNAME=stu0{i}else
USERNAME=stu${i}
fi
useradd USERNAMEmkdir/home/USERNAME mkdir /home/USERNAMEmkdir/home/USERNAME
chown -R USERNAME/home/USERNAME /home/USERNAME/home/USERNAME
chgrp -R class1 /home/USERNAMEi=USERNAME i=USERNAMEi=(($i+1))
done
4.编写 shell 程序,实现自动删除 50 个账号的功能。账号名为 stud1 至 stud50。
参考程序:
#!/bin/sh
i=1
while [ i−le50]douserdel−rstudi -le 50 ] do userdel -r studi−le50]douserdel−rstud{i}
i=((((((i+1 ))
done
5.某系统管理员需每天做一定的重复工作,请按照下列要求,编制一个解决方案:
(1)在下午 4 :50 删除/abc 目录下的全部子目录和全部文件;
(2)从早 8:00~下午 6:00 每小时读取/xyz 目录下 x1 文件中每行第一个域的全部数据加入到/backup 目
录下的 bak01.txt 文件内;
(3)每逢星期一下午 5:50 将/data 目录下的所有目录和文件归档并压缩为文件:backup.tar.gz;
(4)在下午 5:55 将 IDE 接口的 CD-ROM 卸载(假设:CD-ROM 的设备名为 hdc);
(5)在早晨 8:00 前开机后启动。
参考答案:
解决方案:
(1)用 vi 创建编辑一个名为 prgx 的 crontab 文件;
(2)prgx 文件的内容:
50 16 * * * rm -r /abc/
0 8-18/1 * * * cut -f1 /xyz/x1 >;>; /backup/bak01.txt
50 17 * * * tar zcvf backup.tar.gz /data
55 17 * * * umount /dev/hdc
(3)由超级用户登录,用 crontab 执行 prgx 文件中的内容:
root@xxx:#crontab prgx;在每日早晨 8:00 之前开机后即可自动启动 crontab。
6.设计一个 shell 程序,在每月第一天备份并压缩/etc 目录的所有内容,存放在/root/bak 目录里,且文
件名为如下形式 yymmdd_etc,yy 为年,mm 为月,dd 为日。Shell 程序 fileback 存放在/usr/bin 目录下。
参考答案:
(1)编写 shell 程序 fileback:
#!/bin/sh
DIRNAME=

ls /root | grep bak

if [ -z “DIRNAME"];thenmkdir/root/bakcd/root/bakfiYY=‘date+MM=‘date+DD=‘date+BACKETC=DIRNAME" ] ; then mkdir /root/bak cd /root/bakfi YY=`date +%y` MM=`date +%m` DD=`date +%d` BACKETC=DIRNAME"];thenmkdir/root/bakcd/root/bakfiYY=‘date+MM=‘date+DD=‘date+BACKETC=YYMMMMMMDD_etc.tar.gz
tar zcvf $BACKETC /etc
echo “fileback finished!”
(2)编写任务定时器:
echo “0 0 1 * * /bin/sh /usr/bin/fileback” >; /root/etcbakcron
crontab /root/etcbakcron
或使用 crontab -e 命令添加定时任务:
0 1 * * * /bin/sh /usr/bin/fileback
7.有一普通用户想在每周日凌晨零点零分定期备份/user/backup 到/tmp 目录下,该用户应如何做?
参考答案:(1)第一种方法:
用户应使用 crontab –e 命令创建 crontab 文件。格式如下:
0 0 * * sun cp –r /user/backup /tmp
(2)第二种方法:
用户先在自己目录下新建文件 file,文件内容如下:
0 * * sun cp –r /user/backup /tmp
然后执行 crontab file 使生效。
8.设计一个 Shell 程序,在/userdata 目录下建立 50 个目录,即 user1~user50,并设置每个目录的权限,
其中其他用户的权限为:读;文件所有者的权限为:读、写、执行;文件所有者所在组的权限为:读、执
行。
参考答案: 建立程序 Pro16 如下:
#!/bin/sh
i=1
while [ i−le50]doif[−d/userdata];thenmkdir−p/userdata/useri -le 50 ] do if [ -d /userdata ];then mkdir -p /userdata/useri−le50]doif[−d/userdata];thenmkdir−p/userdata/useri
chmod 754 /userdata/useriecho"useri echo "useriecho"useri”
let “i = i + 1” (或 i=((((((i+1))
else
mkdir /userdata
mkdir -p /userdata/userichmod754/userdata/useri chmod 754 /userdata/userichmod754/userdata/useri
echo “useri"let"i=i+1"(或i=i" let "i = i + 1" (或 i=i"let"i=i+1"(或i=(($i+1))
fi
done
5.打印 1-99 之间的奇数到文件
方法一:
seq >newfile 1 2 99方法二:
#!/bin/bash
i=1
while [ $i -le 99 ]
do
if [ ithenecho"i % 2 == 1 ] then echo "ithenecho"i” >newfile
fi
done
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,KaTeX parse error: Expected 'EOF', got '}' at position 2: 4}̲' 其中文件在:/etc/ht…ip_num" -le “$(expr KaTeX parse error: Expected '}', got '#' at position 2: {#̲remote_ip[@]} -…remote_user”@“KaTeX parse error: Expected '}', got 'EOF' at end of input: {remote_ip[ip_num]}” df -h >/tmp/diskcheck_tmp
grep ‘^/dev/’ /tmp/diskcheck_tmp|awk '{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 5}̲'|sed 's/\%//g'…read_num" -le (wc−l&lt;/tmp/diskchecktmpnum)]//计算有多少行dosize=(wc -l &lt; /tmp/diskcheck_tmp_num)] //计算有多少行 do size=(wc−l</tmp/diskcheckt​mpn​um)]//计算有多少行dosize=(sed -n “readnum&quot;′p′/tmp/diskchecktmpnum)if[&quot;read_num&quot;&#x27;p&#x27; /tmp/diskcheck_tmp_num) if [ &quot;readn​um"′p′/tmp/diskcheckt​mpn​um)if["size” -gt “$FSMAX” ]
then
$(grep '^/dev/’ /tmp/diskcheck_tmp|sed -n $read_num’p’ >
/tmp/disk_mail)
$(echo (remoteip[(remote_ip[(remotei​p[ip_num]) >> /tmp/disk_mail)
(mail−s&quot;diskcheckalert&quot;admin&lt;/tmp/diskmail)fireadnum=(mail -s &quot;diskcheck_alert&quot; admin &lt;/tmp/disk_mail) fi read_num=(mail−s"diskchecka​lert"admin</tmp/diskm​ail)fireadn​um=(expr readnum+1)doneipnum=read_num + 1) done ip_num=readn​um+1)doneipn​um=(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 " KaTeX parse error: Expected 'EOF', got '}' at position 4: 2";}̲" 4shell 编程,实现一…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 DESTFILEPART3‘DESTFILE=DEST_FILE_PART3` DEST_FILE=DESTF​ILEP​ART3‘DESTF​ILE=DEST_FILE_PART1DESTFILEPART2DEST_FILE_PART2DESTF​ILEP​ART2DEST_FILE_PART3
mv $each $DEST_FILE
done

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: