需求:以前的备份文件是按月份目录结构存储的,最里面存放的是按天压缩的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
联系客服