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"
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是规范格式输出的