Linux shell工程应用实例总结

1.查找当前目录中所有大于500M的文件,把这些文件名写到一个文本文件中,并统计其个数。

find ./ -size+500M -type f | tee file_list | wc -l

2.在目录/tmp下找到100个以abc开头的文件,然后把这些文件的第一行保存到文件new中。

for filename in`find /tmp -type f -name "abc*"|head -n 100`

do

sed -n '1p'$filename>>new

done

3.把文件b中有的,但是文件a中没有的所有行,保存为文件c,并统计c的行数。

grep -xvf a b |tee c | wc -l

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

read -p"input a file:" filename

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

then

    cp $filename /dev/

fi

5.每隔10分钟监控一次,监控/usr下如果大于5G,发邮件给管理员

#!/bin/bash

while true

do

    sleep 600

    n=$(du -s /usr | cut -f1)

    if [ $n -gt 5242880 ]

    then

        mail -s "greater"filwsyl@gmail.com < ~/filename #将文件filename的内容发送出去。

    fi

done

6.从a.log文件中提取包含"WARNING"或"FATAL",同时不包含"IGNOR"的行,然后提取以":"分割的第5个字段

grep -E 'WARNING|FATAL'a.log | grep -v IGNOR | awk -F ":" '{print $5}'

7.编写一个脚本,进行简单的减法运算,要求提示输入变量

#!/bin/bash

read -p"input a number:" num1

read -p"input another number:" num2

let"num3=num1-num2"

echo $num3

8.把某个目录下的文件扩展名改为bat,再以时间为文件名压缩打包存放到某个目录。

#!/bin/bash

for file in $(ls$1)

do

    new_file=${file%.*}.bat

    mv ./$1/$file ./$1/$new_file

    tmp=$(date +%y)

    tar cvf ./$tmp.tar ./$1

done

9.从网上下载一个文件,保存到指定目录

#!/bin/bash

url=http://rs1.bn.163.com/ent/2009/05/20_canquedege.wma

dir=~/下载

wget -P $dir$url

10.判断一个数是不是完数。打印出1-1000之间的完数。 完数就是约数的和等于自身2倍的数。(6,28,496)

#!/bin/bash

sub()

{

    i=1;

    sum=0;

    while [ $i -le $num ]

    do

        let "m=num%i"

        if [ $m -eq 0 ]

        then

            let "sum=sum+i"

        fi

        let "i=i+1"

    done

    let "a=2*num"

    if [ $a -eq $sum ]

    then

        echo $num

    fi

}

num=1

while [ $num -le1000 ]

do

    sub

    let "num = num+1"

done

11.以行为单位,求文件A和文件B交集,并集,差集。

并:

sort -m<(sort A | uniq) <(sort B | uniq) | uniq

交:

sort -m<(sort A | uniq) <(sort B | uniq) | uniq -d

差:

sort -m<(sort A | uniq) <(sort B | uniq) <(sort B | uniq) | uniq -u

12.在某个文件夹下查找含有指定字符串的文件

#!/bin/bash

for file in $(ls$2)

do

    bname=$(grep -l $1 $2/$file)

    basename $bname

done

调用方法:./tst 000 bash#在文件夹bash中查找含有“000”的文件。

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

#!/bin/bash

groupadd class1

for i in{9901..9930}

do

    xx=$(echo $i | sed 's/99//');

    useradd -g class1 std$xx -p ""

done

14.实现自动删除50个账号的功能。账号名为stud1至stud50

#!/bin/bash

i=0

while [ i -le 50]

do

   let i++

       userdel -r stud$i

done

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

(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在里面增加下面内容:

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

2)00 8-18 * * *root cat /xyz/x1|awk '{print $1}' >> /backup/bak01.txt 2>&1 &  # 2>&1 &2>&1就是用来将标准错误2重定向到标准输出1中的。此处1前面的&就是为了让bash1解释成标准输出而不是文件1。至于最后一个&,则是让bash在后台执行。

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

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

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

chkconfig--level 2345 crond on

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

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

vim/usr/bin/fileback.sh

#!/bin/bash

#fileback.sh

#fileexecutable: 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 &

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

首先说一下非root用户编写crontab文件的方法。

一:

[sword@localhost~]$ vim cronfile

[sword@localhost~]$ crontab cronfile

二:

[sword@localhost~]$ crontab -e

no crontab forsword - using an empty one

crontab:installing new crontab

查看结果:

[root@localhostcron]# crontab -u sword -l

显示内容是:/var/spool/cron/sword 文件的内容。

vim ~/shit.sh

#!/bin/bash

cp/user/backup/* /tmp/

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

crontab -e

0 0 * * 0~/shit.sh &

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

#!/bin/bash

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

do

       mkdir -p /usrdata/user$i

       cd /usrdata

       chmod 754 user$i

done

19.一个文件内容全部是类似

【202.205.151.21】--【23:59:22】-“HTTP GET”-“Mozila”

...

写一个SHELL命令找出最多的10个IP

awk -F"--" '{print $1}' shit | sort | uniq -c | sort -r | sed -n '1,10p'

20./tmp路径下有800个文件,文件名的格式是:filename_YYYYMMDD_序列号(从001到999).dat, 例如:filename_20040108_089.dat。现在想把这些文件改名,新文件名的格式是:filename_TODAY(当前日期)_序列号(从500开始,到达999之后从001开始).dat,例如: 把filename_20040108_089.dat改为filename_20041222_589.dat,注意新文件名的序列号的顺序需要和原来的一致,即要做排序处理。

#!/usr/bin/bash

DEST_FILE_PART2="_`date'+%Y%m%d'`_"

EXT_NAME=".dat"

SRC_FILE_LIST=`find/tmp -name "*_*_*$EXT_NAME" -print`

for each in$SRC_FILE_LIST; do

    DEST_FILE_PART1=`echo $each | awk-F"_" '{print $1}'`

    OLD_NUM=`echo $each | awk -F"_"'{print $3}' | awk -F"." '{print $1}'`

    DEST_FILE_PART3=`expr $OLD_NUM + 500`

    [ $DEST_FILE_PART3 -gt 999 ] &&DEST_FILE_PART3=`expr $OLD_NUM - 499`

        && DEST_FILE_PART3=`printf %03d$DEST_FILE_PART3`

   DEST_FILE=$DEST_FILE_PART1$DEST_FILE_PART2$DEST_FILE_PART3$EXT_NAME

    echo "mv $each to $DEST_FILE"

    mv $each $DEST_FILE

done

我的解法:

#!/bin/bash

new_file=$(date+20%y%m%d);

for file in $(ls~/bash)

do

    i=$(echo "$file" | sed's/.*_[0-9]*_[0−9]∗.dat/\1/')    #取出序列号

    i=$(echo $i | sed 's/^0*[0−9]∗/\1/')                #去掉序列号前面可能的 ‘0’,

    let "ii=i+500"

    if [ $ii -gt 999 ]

    then

        let "ii=ii-999"

    fi

    ii=`printf %03d $ii`                            #添上可能需要的‘0’

    update=$(echo "$file" | sed 's/.∗_[0-9]*_[0-9]*.dat/\1_'$new_file'_'$ii'.dat/')

    mv ~/bash/$file ~/bash/$update

done

21.要求:在一个脚本中完成这个程序

1.从文件user.list中取出已给定的用户名和用户组,将这些用户和组按规则添加到系统中

2.从password.list中读取已经给定的用户密码。

user.list如下

zhangsanadminuser,dbuser,updatauser

lisi dbuser,updatauser

wangerupdatauser,wheel

 

#!/bin/bash

#group add

for x in ‘awk‘{print $2}’ user.list | sed ’s/,/\n/g’ | sort | uniq -c|sed ’s/[^a-zA-Z]//g”

do

        groupadd $x &> /dev/null

done

#back message

if (($?==0))

then

        echo “Group Ok!!”

else

    exit 1

fi

#user add

for i in ‘awk‘{print $1}’ user.list’

do

    for y in ‘awk ‘{print $2}’ password.list’

    do

    useradd $i &> /dev/null

    echo $y | passwd –stdin $i &>/dev/null

    done

done

#back message

if (($?==0))

then

    echo “User Ok!”

else

    exit 1

fi

#add users togroups

for((q=1;q<=3;q++))

do

    usermod -G ‘awk “NR==$q {print $2}”user.list | awk ‘{print $2}” ‘awk “NR==$q {print $1}” user.list | awk ‘{print$1}” &> /dev/null

done

if (($?==0))

then

    echo “All Finished!”

fi

原文地址http://www.zhangyiqun.cn/115.html

22.比较两个小数大小。

awk -v num1=6.6-v num2=5.5 'BEGIN{print(num1>num2)?"0":"1"}'

echo "0.14> 0.15" | bc

expr 1.2 \<1.3

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值