分享

【shell编程】遍历目录+解压文件+过滤关键字 - bkeep的日志 - 网易博客

 liluvu 2010-09-28

 需求:以前的备份文件是按月份目录结构存储的,最里面存放的是按天压缩的bz2文件! 现在要从这些备份文件里面过滤出含有“bkeep”关键字的行!

思路:1,遍历指定的目录及其子目录

              2,如果扫描到.bz2结尾的文件,将它复制到/tmp/tmp下解压

              3grep “bkeep” /tmp/tmp/* 仅过滤出/tmp/tmp/当前目录下的包含bkeep关键字的文件(子目录另外处理)

              4,注意:整个脚本只过滤bz2解压出来的文件!!不会对非bz2的文件动手!切忌!!

解决方案:

[root@nod1 bkeep]# cat ml.sh

#!/bin/sh

mkdir -p /tmp/tmp  //创建临时文件夹,用来存放解压后的文件

mkdir -p /usr/local/bkeep  //创建临时文件夹,用来存放过滤结果

list_alldir(){   

 

for file in $1/*

do

if [ -d $file ]; then

list_alldir $file

elif [ `echo $file |awk 'BEGIN {FS="."} {print $NF}'` = "bz2" ]  //判断后缀名为是否为 bz2

//如果是的话接下来解压它到临时文件夹内

then

   tar jxf $file -C /tmp/tmp   //解压文件

   grep_word /tmp/tmp   //执行过滤关键字的函数

   rm -rf /tmp/tmp/*     //清理现场,为解压下一个文件做准备!

echo "$file ..........ok!"    //显示被处理的bz2文件!

fi

done

}

 

grep_word(){

for fileb in $1/*

do

if [ -d $fileb ]; then

# “bkeep”是你想要过滤的关键字,根据实际,自行设定

grep -H "bkeep" $fileb/* >> /usr/local/bkeep/bkeep.txt   //H 结果中显示文件名,方便我们阅读!

grep_word $fileb

fi

done

}

list_alldir $1

 

[root@meta bkeep]# ./ml.sh /boot   //执行过滤操作,假设备份文件保存在/boot目录下

/boot/aab.tar.bz2 ..........ok!

 

[root@meta bkeep]# cat bkeep.txt  //查看过滤出来的信息

/tmp/tmp/aab/aa:bkeep /boot/aab/aa hello

/tmp/tmp/aab/cc:bkeep am cc

 

基础知识:

1,逐级显示目录结构

#!/bin/sh

list_alldir(){

for file in $1/*

do

if [ -d $file ]; then

echo $file

list_alldir $file

fi

done

}

 

if [ $# -gt 0 ]

then

list_alldir "$1"

else

list_alldir "."

fi

 

2,截取文件名的后缀

截取字符串   //-d指定域分割符”.” -f 截取第几个域

[root@meta bkeep]# echo "aa.bb.cc.bz2" |cut -d"." -f1

aa

[root@meta bkeep]# echo "aa.bb.cc.bz2" |cut -d"." -f2

bb

[root@meta bkeep]# echo "aa.bb.cc.bz2" |cut -d"." -f3

cc

[root@meta bkeep]# echo "aa.bb.cc.bz2" |cut -d"." -f4

bz2

[root@meta bkeep]# echo "aa.bb.cc.bz2" |cut -d"." -f-2

aa.bb

 

3xargs的新用法

[root@nod1 local]# ls | xargs -n 1 echo ====    //-n说明xargs每次处理几个参数

==== a.sh

==== aa.gz

==== bin

==== bkeep

==== dir.sh

 

4grep 中的几个参数:-H 显示文件名;-r 递归过滤目录及其子目录中的所有内容

[root@meta bb]# grep -r "bkeep" /boot/*     //递归过滤/boot/目录中的所有文件

/boot/aa:bkeep hello

/boot/aab/bb/kk:bkeep /bb/kk/

/boot/aab/aa:bkeep hello

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多