grep误用正则表达式
之前在写shell脚本,有一个需求:获取当前目录下,带QRYTYP前缀,而且不以".tmp"结尾的文件名称。
1.首先是"QRYTYP*"
2.不以".tmp"结尾
3.要的是文件,而不是文件夹
首先自己思考了一下下,之后再从网上查找,得到下面的结果:
ls -1 -F QRYTYP* | grep -v [/$] | grep -v [".tmp"$] #首先在这里解释下面的思路,顺便也帮大家复习一下
-l:表示除了文件名之外,还将文件的权限、所有者、文件大小等信息详细列出来。
-F:对于目录,以'/'结尾,对于普通文件,结尾没有任何特殊字符,但是我的linux是SUSE版的,目录是以":"结尾
说白了上面的意思就是先拿到所有带"QRYTYP"文件(包括目录和文件),之后就grep -v [/$]把目录排除在外,再通过管道把带后缀".tmp"的文件排除在外。实际这里会有几个问题:
1.-F并没有把目录以"/"结尾显示
2.grep是原生支持正则表达式的,但是这样写[/$],大家可能都会以为是以"/"结尾,理所当然地觉得[]是正则表达式的分界符,实际上grep -v [/$]的意思是:文件名只要包含"/"或者"$"都会被排除在外
3.grep -v [".tmp"$]同理2,只要包含"."、"t"、“m”、"p"、"$"任一字符都会排除在外
所以上面最终的写法应该是这样的:
find . -maxdepth 1 -not -type d -type f -name 'QRYTYP*' -printf "%f\n" | grep -v '.tmp'$ #-printf "%f\n"表示只输出文件名,不要把全路径输出
大家有兴趣可以看看这篇博客:http://www.cnblogs.com/xuxm2007/archive/2011/06/15/2081671.html