获取目录文件日期并比较
-----------对目录操作----------------
pocdata_exp_from_172.20.8.23_nscrmdb_20140907.0200
1、根据修改时间和当前时间比较、目录名称进行筛选,再直接删除
find . -maxdepth 1 -follow -type d ! -mtime -7 -name "pocdata_exp_from_*" | xargs rm -rf
(1) -maxdepth 1 表示只找到第一层
(2)-type d表示目录 -type f表示文件
(3)除了mtime还可以使用-newer参数
(4)删除也可使用命令-exec rm -rf
2、先筛选目录,再用awk根据目录修改时间(时间戳)和目标时间比较,再直接删除 --循环中添加处理为自主产权
ls -F | grep '/$'|grep pocdata_exp_from | awk '{cmd="date +%s --date=\"-1 day\"";cmd|getline a;for(i=1;i<=NF;i++){cmd="stat -c %Y "$i"";cmd|getline b;if(b<a){print $i}}}'
(1)删选目录ls -F | grep '/$'|grep pocdata_exp_from
(2)时间还以用"$(date -d "7 days ago" "+%Y%m%d")"
(3)ls|awk '{for(i=1;i<=NF;i++){print NF,$i}}'
(4)ls|awk '{for(i=1;i<=NF;i++){cmd="stat -c %Y "$i"";cmd|getline b;print b,NF,$i}}'
3、先筛选出目录,再筛选出符合时间的目录(根据目录名中的时间),删除
find . -maxdepth 1 -type d -name "pocdata_exp_from_*" |sed 's/\(.*\)\([0-9]\{8\}\)\(.*\)/\2/'
-----对非目录操作-----只是获取时间的字符串-------------
-rw-r--r--. 1 aiweb_s aigrp 13408625 2014-08-06 13:30:30.913401174 +0800 catalina.out
现在需要提取该文件的时间属性,显示为: 20140806133030
1、
ls -l --full-time catalina.out |sed -e 's/\(.*\)\([0-9]\{4\}-[0-9]\{1,2\}-[0-9]\{1,2\} [0-9]\{1,2\}:[0-9]\{1,2\}:[0-9]\{1,2\}\)\(.*\)/\2/' -e 's/[- :]//g'
(1)“s//”替换,"//“中间包含了三部分,看做一个整体替换成其中第二部分
(2)“/[- :]//g”,将三个符号全替换为空
(3)-e 执行多个sed命令,应该可以用";"分隔,放在一个"‘ ’"中
2、
stat catalina.out |sed -n '6 s/[- :\(Modify\)]//gp'|awk -F. '{print $1}'
(1)取stat结果的第六行,去掉其中的"-""Modidfy"" "":"符号
(2)将上面的结果以"."分隔,取第一部分
3、直接用awk做列的分隔
awk 'BEGIN {FS="[-:. ]";OFS="";"ls -l --full-time catalina.out " |getline;print $13,$14,$15,$16,$17,$18}'
(1)BEGIN{}预置了内部变量FS字段分隔符,上面句子中用的正则,OFS为反向输出分隔(上面的语句中其实就是合并分割后的各字段)
(2)其他RS/ORS行分隔符(RS默认"\n") http://blog.51yip.com/shell/1151.html
(3)getline 通过管道或者标准输入读入,如果读取成功,getline返回1;如果读到文件结束符(EOF),getline返回0;如果发生错误,例如打不开文件,getline返回-1,所以,getline可以用于while循环中
=================================================
sed命令的两个作用:匹配+操作(分割替换等)
sed '/^\.\/\([0-9]\{8\}\)$/!d; s//\1/'
(1)sed使用的正则表达式是括在斜杠线"/"之间的模式:^\.\/\([0-9]\{8\}\)$ ("./"后面连续8个0-9的数字)
^匹配开头,$匹配结尾
“.” 匹配除换行符以外的单个字,这里前面加了个“\”转义,就表示“.”本身
\(..\)保存已匹配的字符
[]匹配指定字符组内的任一字符
x\{m\} 连续m个x
(2)!d删除其他行
(3)s//\1/'
=================================================
偶尔在一个shell脚本里面看到了一个类似sed 's/(\(.*\))/\1\1/'这样的语句,其实这个sed替换就是针对含有括号的情况
no1=100(AAA) no2=100(BBB) no3=100(CCC) no4=(DDD)
其中AAABBBCCCDDD都是变化的,我们要提取AAA或者BBB的情况
首先理解一个()的情况
举个例子:
[root@mail root]# echo "111(222)333"| sed 's/(\(.*\))/\1\1/'
111222222333
因为(\(.*\))只有这一个部分,所以\1就意味着这一个部分提取两次(如果是\2就应该提不到东西)
[root@mail root]# echo "111(222)333"| sed 's/(\(.*\))/\1\2/'
sed:-e 表达式 #1,字符 16:Invalid reference \2 on `s' command's RHS
由于"("不是元字符,所以直接写"("(就表示"("这个符号,而"\("才表示包含什么的意思
而又因为是()里面的内容,所以将222提取两次
如果将()去掉,例如
[root@mail root]# echo "111(222)333"| sed 's/\(.*\)/\1\1/'
111(222)333111(222)333
那么提取的匹配就是这个部分了
-------------------------------------
[root@mail root]# echo "111(222)333"| sed 's/\(.*\)(\(.*\))/\1\1\1/'
111111111333
因为//里面是由\(.*\) 和 (\(.*\))两部分组成,而\1仍然是提取第一部分,也就是(222)前的所有内容和(222)这个整个部分替换为(222)前的所有内容提取三次,其后的333不变
[root@mail root]# echo "111(222)333"| sed 's/\(.*\)(\(.*\))/\2\2\2/'
222222222333
将(222)前的所有部分和(222)看成一个整体,被替换为()内的部分,也就是222。
此处理解\2\2\2,2的含义应该是提取第二个\(.*\)即:“第二个包含” 得意思也就是:(将()换成yy也是一样得含义)
[root@mail root]# echo "111y222y333"| sed 's/\(.*\)y\(.*\)y/\2\2\2/'
222222222333
-------------------------------------
两个括号及其以上得情况:
[root@mail root]# echo "no1=100(AAA) no2=100(BBB) no3=100(CCC) no4=(DDD)" | sed 's/\(.*\)(\(.*\)).*/\2/'
DDD
[root@mail root]# echo "no1=100(AAA) no2=100(BBB) no3=100(CCC) no4=(DDD)" | sed 's/.*(\(.*\)).*/\1/'
DDD
以上两句意义相同。
我们本想取到AAA,但是为什么取了DDD呢
正则表达式是有贪婪性的,它总是与最长的可能长度匹配,而且越是排在前面的通配符优先级越高。按照这样的原则取到得就是DDD了,那么我们应该如何取得AAA呢?
我们考虑如果在模式串中第一个".*"中告诉sed这个".*"是不能含有"("的,同时第二个".*"中不能含有""应该OK吧--[benmm]应该是第二个".*"中不能含有")"吧
试一试:
[root@mail root]# echo "no1=100(AAA) no2=100(BBB) no3=100(CCC) no4=(DDD)" | sed 's/[^(]*(\([^)]*\)).*/\1/'
AAA
以此类推,可以得到
[root@mail root]# echo "no1=100(AAA) no2=100(BBB) no3=100(CCC) no4=(DDD)" | sed 's/[^(]*(\([^)]*\))[^(]*(\([^)]*\))[^(]*(\([^)]*\))[^(]*(\([^)
]*\))/\2/'
BBB
将2改为3就是CCC
将3改为4就是DDD