linux脚本加标题,好的shell脚本题目

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

8643d449249e5476d4d172bf1a834036.bmp

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值