一、需求
有一个日志文件如下:
#因涉及到他人产生环境的东西,我做了一些修改 [root@vm81 t1]# cat a.log /disk1/www/hua.com/js/ddrDetail.js /disk1/www/hua.com/back/admin/index.php /disk1/www/hua.com/new/index.php /disk1/www/www.hualinux.com/index.php
上面的a.log日志文件中包括很多文件所在的具体路径,而且路径的目录层次深度是不一样的(有3层、4层、5层混的)
要求:去掉文件名,只保留路径,变成这样
/disk1/www/hua.com/js /disk1/www/hua.com/back/admin /disk1/www/hua.com/new /disk1/www/www.hualinux.com
二、分析
2.1 分析
上面要去掉文件名,只保留路径的话,有/明显分隔,是不是可以用awk呢?但是路径长短又不一致怎么办?
再看一下,是不是有其它的规律,虽然它路径目录层次深度不一样,后缀名也不一样,但是它最后没有/啊!
PS:是不是很熟悉的感觉?
注册的时候,填写的手机号的邮箱他们是怎么判断你写错的,肯定是有一个判断规律
比如手机肯定是11位数字,邮箱肯定有一个@
这种有规律的东西,我们叫它正则表达式。grep、sed、awk都支持正则表达式
2.2 正则表达式
下面是一个正则表达式的表:
三、解决
这里我使用sed命令,处理思想是
根本观察,上面的所有文件路径都是以 最后一个”/“+文件名结束的,是没有”/“的,这就是所谓的通用规律!
好,我现在就用sed去表达,使用的是sed的正则,因为有
\1 子串匹配标记 \(..\) 匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。
这就是我要的东西,下面是命令和效果
[root@vm81 t1]# cat a.log
/disk1/www/hua.com/js/ddrDetail.js
/disk1/www/hua.com/back/admin/index.php
/disk1/www/hua.com/new/index.php
/disk1/www/www.hualinux.com/index.php
[root@vm81 t1]#
[root@vm81 t1]#
[root@vm81 t1]# sed -n 's#\(.*\)/\(.*\)#\1#p' a.log
/disk1/www/hua.com/js
/disk1/www/hua.com/back/admin
/disk1/www/hua.com/new
/disk1/www/www.hualinux.com