SHELL笔试题

  • Post author:
  • Post category:其他



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

#!/bin/bash

#1.sh

#判断一文件是不是字符或块设备文件,如果是将其拷贝到 /dev 目录下

#file executable: chmod 755 1.sh

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH

echo -e “The program will Judge a file is or not a device file./n/n”

read -p “Input a filename : ” filename

if [ -b “$filename” -o -c “$filename” ]

then

echo “$filename is a device file” && cp $filename /dev/ &

else

echo “$filename is not a device file” && exit 1

fi

----------------------------------------------------

2. 设计一个shell程序,添加一个新组为class1,然后添加属于这个组的30个用户,用户名的形式为stdxx,其中xx从01到30。

#!/bin/bash

#2.sh

#设计一个shell程序,添加一个新组为class1,然后添加属于这个组的30个用户,用户名的形式为stdxx,其中xx从01到30。

#file executable: chmod 755 2.sh

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH

groupadd class1

for i in {9901..9930}

do

xx=`echo $i | sed ‘s/99//g’`

useradd -g class1 std$xx

echo std$xx | passwd std$xx –stdin

echo -e “user std$xx password is std$xx” >> /root/newuser.txt

done

-------------------------------------------

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

#!/bin/bash

#4.sh

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

#file executable: chmod 755 3.sh

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH

i=1

while [ i -le 50 ]

do

let i++

userdel -r stud$i

done

---------------------------------------------

4.某系统管理员需每天做一定的重复工作,请按照下列要求,编制一个解决方案:

(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前开机后启动。

vim /etc/crontab 在里面增加下面内容:

50 16 * * * root rm -rf /abc/* 2>&1 &

00 8-18 * * * root cat /xyz/x1|awk ‘{print $1}’ >> /backup/bak01.txt 2>&1 &

50 17 * * 1 root cd /data;tar -zcvf backup.tar.gz * 2>&1 &

55 17 * * * root umount /hdc 2>&1 &

5)在早晨8:00前开机后启动 –> 这个我不是很明白它的意思,不知道是不是8点前开机就启动上面的设定,8点后才开机就不用启动的意思。

姑且用下面这个命令吧

chkconfig –level 2345 crond on

---------------------------------------------

5.设计一个shell程序,在每月第一天备份并压缩/etc目录的所有内容,存放在/root/bak目录里,且文件名

为如下形式yymmdd_etc,yy为年,mm为月,dd为日。Shell程序fileback存放在/usr/bin目录下。

vim /usr/bin/fileback.sh

#!/bin/bash

#fileback.sh

#file executable: chmod 755 fileback.sh

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH

filename=`date +%y%m%d`_etc.tar.gz

cd /etc/

tar -zcvf $filename *

mv $filename /root/bak/

——————————————————

vim /etc/crontab 加入

* * 1 * * root ./fileback.sh &

------------------------------------------------

6.有一普通用户想在每周日凌晨零点零分定期备份/user/backup到/tmp目录下,该用户应如何做?

可以用 contab -e 来做,和上面一题差不多。

7.设计一个Shell程序,在/userdata目录下建立50个目录,即user1~user50,并设置每个目录的权限,其

中其他用户的权限为:读;文件所有者的权限为:读、写、执行;文件所有者所在组的权限为:读、执行。

#!/bin/bash

#7.sh

#file executable: chmod 755 7.sh

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH

for ((i=1;i<=50;i++))

do

mkdir -p /usrdata/user$i

cd /usrdata

chmod 754 user$i

done

利用

top

取某个进程的

CPU

的脚本

:


2009-8-21

磁针石:

xurongzhong#gmail.com

博客:


oychw.cublog.cn


#/bin/sh

Max_CPU=0

Avg_CPU=0

Total_Time=1

Process=$1

Interval=$2

# check the parameters

if [ $# -ne 2 ]; then

echo “Usage: $0 ProcessName Interval”

exit

fi

LogFile=”Per.txt”

echo “`date`” > $LogFile

while sleep $Interval

do

top -d 1 -n 1|grep $Process|grep -v grep|awk ‘{print $9″/t”$10}’ >> $LogFile

done


判断是否是设备文件



#/bin/bash


echo -e “The program will Judge a file is or not a device file./n/n”


read -p “Input a filename:” filename


if [ -b $filename -o -c $filename ]; then


echo “$filename is a device file”


exit 0


else


echo “$filename is not a device file”


exit 1


firead –p

:用于在读数据时输出提示信息


注意!

[

之间是有空格的:

if ! [ -f $filename ] ; then

。一般用

if [ ! * ]


添加用户:



#/bin/bash



groupadd -f class1


for i in {9909..9911}


do


xx=`echo $i | sed ‘s/99//g’`


useradd -g class1 std${xx}


echo std${xx} | passwd std${xx} –stdin


echo -e “user std${xx} passwd is std${xx}”>>/root/newuser.txt


done


exit 0




注意等号的前后不要有空格:

xx=`echo $i | sed ‘s/99//g’`



变量如果前后有字符,要是大括号


统计

IP

访问:

要求分析

apache

访问日志,找出访问页面数量在前

100

位的

IP

数。日志大小在

78M

左右。以下是

apache

的访问日志节选



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)”




# awk ‘{print $1}’ log      |sort |uniq -c|sort -r |head -n10


5 221.224.78.15


3 221.233.19.137


1 58.63.148.135


1 222.90.66.142


1 222.218.90.239


1 222.182.95.155


1 221.7.249.206


1 221.237.232.191


1 221.235.61.109


1 219.129.183.122


这个地方有个疑问,为什么在使用

uniq

之前要

sort




2

个数之和


#/bin/bash


typeset first second


read -p “Input the first number:” first


read -p “Input the second number:” second


result=$[$first+$second]


echo “result is : $result”


exit 0



文本分析

取出

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


答案:


cat /etc/passwd|awk -F: ‘{if ($7!=””) print $7}’|sort|uniq –c


cat /etc/passwd|awk -F: ‘{if ($7!=””) print $7}’|sort|uniq -c | awk ‘{print $2,$1}’



文件整理


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


答案:

join employee bonus | sort -k 2



打印本机的交换分区大小

处理结果

:

Swap:1024M



free -m | sed -n ‘/Swap/p’ | awk ‘{ print $2}’


free -m | sed -n ‘s/Swap:/ */([0-9]*/).*//1/p’


输出本机创建

20000

个目录所用的时间

处理结果

:

real    0m3.367s

user    0m0.066s

sys     0m1.925s


答案:


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



real    0m6.200s


user    0m1.128s


sys     0m4.710s


打印当前

sshd

的端口和进程

id

处理结果

:

sshd Port&&pid: 22 5412


答案:

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


打印

root

可以使用可执行文件数

处理结果

:

root’s bins: 2306



echo “root’s bins: $(find ./ -type f | xargs ls -l | sed ‘/-..x/p’ | wc -l)”


root’s bins: 3664


编译当前目录下的所有

.c

文件:



for file in *.c; do echo $file ; gcc -o $(basename $file .c) $file  ; sleep 2;  done > compile 2>&1


将一目录下所有的文件的扩展名改为

bak


for i in *.*;do mv $i ${i%%.*}.bak;done