bupt本科-Linux基础(董远)-某年期末大作业
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LINUX系统与程序设计2011春本科生大作业
------------------------------------------
1. Shell编程:查询系统最近1000条命令中使用最多的前10条命令,编写Shell脚本实现此功能。
写出具体代码和操作过程。
------------------------------------------
# echo $HISTSIZE 1000
# history | awk '{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl | head -n10
解释:第一行的echo $HISTSIZE 1000是设置history中记录1000条命令;第二行中用awk 统计history 中的命令部分出现的次数,去掉“./" 这样不算命令的情况,最后排序输出,列出前10 个负责统计最近1000条命令中使用最多的10条命令。
-------------------------------------------
2. Linux操作系统的系统配置文件默认储存在/etc目录下,因此管理员可以通过查看相应的文件来得知系统配置信息。
编写一个shell脚本显示下列系统配置信息:
(1)CPU相关信息:如处理器类型,速度等;
(2)内存信息;
(3)挂载文件信息。
-------------------------------------------
说明:通过在网上查到的资料,以及ls对/etc目录的列表,没有发现系统配置信息存在于/etc 中,而应该是/proc中。
#ls -a /etc
#ls /etc/cpuinfo
#ls /etc/meminfo
#ls /etc/mount
-------------------------------------------
3. 编写my_cp.sh脚本,功能是把一个文件拷贝到另一文件。
其有两个参数,一个作为输入文件(source),一个作为输出文件(destination)。
脚本需满足下面一些条件:(1)确保输入的两个参数不重名;
(2)验证输出文件(destination)是一个文件,而不是目录;
(3)验证输入文件(source)文件存在;
(4)检查输出文件是否存在,若存在,则询问用户是否覆盖。
-------------------------------------------
#! bin/sh
sign=1
if
[ "$#" != 2 ]
then
echo "please make sure that you enter 2 arguments, first is the source file, second is the destination directory."
exit 1
fi #if 1 , check the amount of the arguments.
if
[ ! -f "$1" ]
then
echo "the source file(the first argument) doesn't exist, please check your arguments" exit 1
fi #if 2 , check if the source file exists.
if
[ "$1" = "$2" ]
then
echo "the source file and the destination is the same file!"
exit 1
fi #if 3 , check the amount of the arguments.
if
echo "$2" | grep -q '^[a-zA-Z0-9_]\+$'
then
continue
else
echo "your destination is a invalid file name."
exit 1
fi #if 4, check if the destination is a invalid file name
if
[ -f "$2" ]
then
while [ $sign -eq 1 ]
do
echo "the destination file has been created, are u sure to overwrite it?(please enter y/n)" read YesOrNo
case "$YesOrNo" in
y)
cp $1 $2
echo "------------------------------------------"
echo "the file has been copied"
sign=0
continue
;;
Y)
cp $1 $2
echo "------------------------------------------"
echo "the file has been copied"
sign=0
continue
;;
n)
sign=0
break
;;
N)
sign=0
break
;;
*)
sign=1
continue
;;
esac
done
exit 1
fi #if 5, make sure if the user wanna overwrite the file that has been created.
cp $1 $2
if [ "$?"=0 ]
then
echo "copy successfully."
else
echo "some error(s) occured."
fi #if 6, to check if there's sth wrong.
-------------------------------------------
4. 根据下列描述,写出具体的操作步骤:
服务器(IP:10.193.251.186)上的/home/data目录下存有一部分数据。
系统管理员需要添加一个新用户(user name:tmpdata)在客户端(IP:10.193.251.189),然后在客户端建立一个/home/data的挂载点(mounted),让客户端的tmpdata用户以只读权限共享服务器上/home/data 下的数据。
-------------------------------------------
#ssh root@10.193.251.186
#useradd tmpdata
#passwd ******
#ssh tmpdata@10.193.251.186
#mount -t -ro 10.193.251.186:/home/data /home/data
-------------------------------------------
5. 帮助LINUX系统管理员解决每天需要做的一些重复工作(详细如下)(hint:使用crontab)
(1)每天在4:50 p.m.删除“/abc”目录下所有的子目录和文件;
(2)每天从8:00a.m.到6:00p.m.,读取“/xyz”目录下的“x1”文件,只读取此文件的第一列,然后把读取的数据保存到“/backup”目录下的“/bak01.txt”中。
(hint:cut指令)
(3)在每个星期一的5:50p.m.,把“/data/”中的所有目录和文件压缩存档到一个文件“backup.tar.gz”。
(4)每天5:55p.m.卸载CD-ROM。
(假设CD-ROM是被命名为hdc)
-------------------------------------------
定时管理功能:
crontab -e
50 16 * * * rm -rf /abc
* 8-18 * * * cut -d: -f 1 /xyz/x1 > /backup/bak01.txt
50 17 * * mon tar -xzf backup.tar.gz /data
55 17 * * * umount /dev/hdc
-------------------------------------------
6.Makefile与C编程:本题考查Makefile的编写,C语言基础,以及编程规范性。
编写C程序,完成单向链表反转功能,如:输入字符串Hello World,每个链表节点仅保存一个字符,最后将整个单向链表的顺序反转,并返回链表头指针。
要求:(1)建立四个文件:main.c reverse.c reverse.h Makefile;
(2)main.c仅包含main()函数,负责输入字符串,调用反转函数;
(3)在合适的文件中声明你的数据结构,对函数进行声明;
(4)在合适的文件中存储反转函数的实现;
(5)编写Makefile,并使用GCC通过Makefile对你写的程序实现编译,连接,形成最终可以执行的文件。
-------------------------------------------
main.c文件
-------
#include "stdio.h";
#include "stdlib.h";
#include "reverse.h"
char main(void)
{char *i;
NODE *head,*p,*q;
head=NULL;
printf("Enter :"); scanf("%c",i);
for(i=1;i<=n;i++)
{
p=(NODE *)malloc(sizeof(NODE));
p->;data=i;
if(head==NULL)
q=head=p;
else{
q->;next=p;
q=p;
}
}
q->;next=NULL;
for(p=head;p;p=p->;next)
p=f(head);
printf("%4d",p->;data);
return 0;
}
------
reverse.c
-------
#include "reverse.h"
NODE *f(NODE *head)
{
NODE *p,*q;
NODE *h;
h=NULL;
for(q=head,p=head->;next;p;q=p,p=p->;next)
{
if(h==NULL){
h=q;
h->;next=NULL;
}
else{
q->;next=h;
h=q;
}
}
q->;next=h;
h=q;
return h;
}
----------
reverse.h
----------
typedef struct NODE
{
char data;
struct NODE *next;
}NODE;
---------
Makefile
---------
edit: main.o reverse.o
cc -o edit main.o reverse.o
main.o : main.c reverse.h
cc -c main.c
reverse.o : reverse.c reverse.h cc -c reverse.c
clean:
rm edit main.o reverse.o。