需求:以前的备份文件是按月份目录结构存储的,最里面存放的是按天压缩的bz2文件! 现在要从这些备份文件里面过滤出含有“bkeep”关键字的行! 思路:1,遍历指定的目录及其子目录 2,如果扫描到.bz2结尾的文件,将它复制到/tmp/tmp下解压 3,grep “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
3,xargs的新用法 [root@nod1 local]# ls | xargs -n 1 echo ==== //-n说明xargs每次处理几个参数 ==== a.sh ==== aa.gz ==== bin ==== bkeep ==== dir.sh
4,grep 中的几个参数:-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 |
|