1、编写个shell脚本将当前目录下大于10K的文件转移到/home目录下

#!/bin/bash
#date:2012.9.5

for filename in `ls -l ~|awk '$5>10240 {print $8}'`
do
       cp $filename /home
done
ls -l /home
echo "Done!"

注:我们看到ls -l的时候:

-rw-------     1   root root     880          06-15    20:58     anaconda-ks.cfg
-rw-r--r--     1   root root     14247      06-15    20:58      install.log
-rw-r--r--     1   root root     3044        06-15    20:57      install.log.syslog
drwxrwxrwx 15 1020 1020  4096        06-15    21:45     squid-3.0.STABLE24
-r-xr-xr-x     1   root root      2427852  06-15    21:39     squid-3.0.STABLE24.tar.gz

在ls -l的时候第5行显示的是以b为单位的大小,而第8行是文件名

2、编写shell脚本获取本机的网络地址

#!/bin/bash
#date:2012.9.5
#print ip and mask

IP=`ifconfig eth0|awk -F '[ :]+' 'NR==2 {print $4}'`
MASK=`ifconfig eth0 | awk -F '[ :]+' 'NR==2 {print $8}'`
echo "$IP/$MASK"

注:具体的解释看:http://fantefei.blog.51cto.com/2229719/982032

3、用Shell编程,判断一文件是不是设备文件,如果是将其拷贝到 /root目录下

#!/bin/bash
echo -n "input file name:"
read FILENAME
if [ -c "$FILENAME" -o -b "$FILENAME" ]
then
cp $FILENAME /root
else
echo "cuo!"
fi

4、设计一个shell程序,添加一个新组为class1,然后添加属于这个组的15个用户,用户名的形式为stuxx,其中xx从01到15

#!/bin/bash
i=1
groupadd class1
while [ $i -le 15 ]
do
       if [ $i -le 9 ]
               then
                       USERNAME=stu0$i
               else
                       USERNAME=stu$i
       fi
       useradd -g class1 $USERNAME
       i=$(($i+1))
done

注意一下10一下的要建立成stu0x的样子,所以加入了if语句

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

#!/bin/bash
i=1
while [ $i -le 50 ]
do
       if [ -d /userdata ]
               then
                       mkdir -p -m 754 /userdata/user$i
                       echo user$i
                       i=$(($i+1))
       else
               mkdir /userdata
               mkdir -p -m 754 /userdata/user$i
               echo user$i
               i=$(($i+1))
       fi

done

注意一下-m建立时候指明权限和i=$(($i+1))的运用

6.整理文件:

employee.txt文件中记录了工号和姓名
100 Jason Smith    
200 John Doe    
300 Sanjay Gupta    
400 Ashok Sharma

bonus文件中记录工号和工资
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| 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符号。
awk用于提取除了tab符号的其余4列。
tr命令用于将字符串中所有大写字符转换为小写字符。
sort命令对字符排序。sort -k 2表示按文件第2个域排序,这里第二个域为姓名,所以是按姓名升序排序。如果要降序排列,则要用sort -k 2r。

7.打印本机交换分区大小

问题:打印本机交换分区大小,输出如下
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.

8.一个文本类型的文件,里面每行存放一个登陆者的IP(某些行是重复的),写一个shell脚本输出登陆次数最多的用户

文件如下:

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

解决方法:cat aa | uniq -c|sort|tail -1|awk -F '[  ]+' '{print $3}'
                   219.217.49.14

uniq -c :将重复行去掉并且在每行的前面添加此行重复的次数

sort排序

tail -1:取出最后一行

-F '[ ]+':因为输出的时候有很多空格,如下:

     3 219.217.49.14

所以[ ]+表示多个空格

9.每10秒打印一次系统时间,连续打印10次

#/bin/bash
i=1
while [ $i -le 10 ]
do
  date
  sleep 10
  let i++
done
注:sleep 10表示沉睡10秒后加1继续循环

let i++相当于i=$(($i+1))

10.

内容如下:

[root@localhost ~]# cat test

zhangsan    80

lisi        81.5

wangwu      93

zhangsan    85

lisi        88

wangwu      97

zhangsan    90

lisi        92

wangwu      88

要求输出格式:(average:平均成绩,total:总成绩)

name#######average#######total

zhangsan     xxx          xxx

lisi         xxx          xxx

wangwu       xxx          xxx

做法:

awk 'BEGIN{print "name","average","total"}{a[$1]+=$2;b[$1]++}END{for(i in a)print i,a[i]/b[i],a[i]}' aa|column -t

注:columnt是规范格式输出的

wKioL1NXaXGSpy5QAAjeEGz19RE884.bmp