Shell命令find和grep详解及正则表达式和通配符的区别
find——较复杂的方式查找文件
-
find命令的完整语法格式:
find [path] [options] [tests] [actions]
-
命令各部分详解:
-
path即查找的路径,可以使用绝对路径,也可以使用相对路径。
-
options:选项参数
选项 含义 -depth 在查看目录本身之前先搜索目录的内容(始终为true) -follow 跟随符号链接 -maxdepth N 最多搜索N层目录 -mount(或-xdev) 不搜索其他文件系统中的目录 -
tests: 测试选项
test参数 描述 -cmin n 匹配n分钟前改变状态(内容或属性)的文件或目录。如果不到n分钟,就用-n,如果超过n分钟,就用+n -mmin n 匹配n分钟前改变内容的文件或目录 -mtime n 匹配n天前改变内容的文件或目录 -empty 匹配空文件及空目录 -name pattern 匹配有特定通配符模式的文件或目录,pattern必须用引号扩起,确保传递给find命令而不是由shell处理 -iname pattern 与-name相似,只是不区分大小写 -newer file 匹配内容的修改时间比file文件更近的文件或目录 -size n 匹配n大小的文件 -type c 匹配c类型的文件 -user name 匹配属于name用户的文件和目录。name可以描述为用户名也可以描述为该组的ID号 -perm mode 寻找访问权限与既定模式匹配的文件或目录。既定模式可以以八进制或符号的形式表示 -inum n 匹配索引节点是n的文件 -group name 匹配属于name组的文件或目录。name可以描述为组名,也可以描述为该组的ID号 下面着重讨论 -size n 和 -type c
-
-size n
其支持的计量单位如下表所示:
字母 单位 b 512字节的块(block) c 字节(char) w 两个字节的字(word) k KB(每单位包含1024字节) M MB(每单位包含1,048,577字节) G GB(每单位包含1,073,741,824字节) 注意:”+“和”-“的用法适用于所有用到数值参数的情况。”+“代表超过,”-“代表未超过。
比如:-size +1M,代表查找的文件大小比给定的数值1M大
-
-type c
其支持的文件类型如下表所示:
文件类型 描述 b block,块设备文件 c char,字符设备文件 d directory,目录 f file,普通文件 l link,符号链接
test参数之间的逻辑关系如下表所示:
操作符 功能描述 -and(与操作) and是默认的逻辑关系,两个测试均为真。有时缩写为-a -or(或操作) 两个测试一个为真。有时缩写为-o -not(非操作) 测试取反。有时缩写为! ( )(括号操作) 提高可读性,以组成更长的表达式。通常用反斜杠“\"来避免特殊含义 -
-
actions:动作选项
动作 功能描述 -delete 删除匹配文件 -ls 对匹配文件执行ls操作 -print 将匹配的文件的全路径以标准形式输出。未指定操作时是默认操作 -quit 一旦匹配成功便退出 -exec command 执行一条命令,该命令可以是用户想要执行的操作命令 -ok command 与-exec类似,但是执行命令之前会针对每个要处理的文件,提示用户确认 下面着重讨论 -exec command
-
-exec command {} ;
其中command表示要执行的命令,魔术字符串{}花括号是一个特殊类型参数,表示当前文件的完整路径。分号;代表分隔符,是必须的,表示命令结束。
通常将{}和;用反斜杠\或者引号’ '进行转义,因此,上述命令也变成-exec command \{\} \;
-
-
grep(global regular expression print)
-
grep与正则表达式有关,用来搜索文本文件中与指定正则表达式匹配的行,并将结果送至标准输出。
-
grep命令完整语法格式:
grep [options] PATTERN [files],如果没有提供文件名,grep将搜索标准输入。
-
命令各部分详解:
-
options:选项参数
选项 功能描述 -c 输出匹配行的数目,而不是输出匹配的行,也可以用–count指定。 -E 启用扩展正则表达式(Extend Regular Expression)。 -h 进行多文件搜索时,抑制文件名输出。也可以用–no-filename指定。 -i 忽略大小写,不区分大写和小写字符,也可以用–ignore-case指定。 -l 输出匹配项文件名而不是直接输出匹配行自身,也可以用–files-with-matches指定。 -v 对匹配模式取反,即搜索不匹配行而不是匹配行,也可以用–invert-match指定。 -n 在每个匹配行面前加上改行在文件内的行号,也可以用–line-number指定。 -
PATTERN:正则表达式
-
常用特殊字符:
字符 含义 ^ 指向一行的开头 $ 指向一行的结尾 . 任意单个字符 [ ] 方括号内包含一个字符范围,其中任何一个字符都可以被匹配。在方括号内加入 ^,构成 [^ ab] 表示反向字符范围,即不匹配指定范围内的字符;在方括号内加入连字符 -,构成 [ a-z],表示字符范围。 -
特殊匹配模式:
匹配模式 含义 [:alnum:] 字母与数字字符 [:alpha:] 字母 [:ascii:] ASCII字符 [:blank:] 空格或制表符 [:cntrl:] ASCII控制字符 [:digit:] 数字 [:graph:] 非控制、非空格字符 [:lower:] 小写字母 [:print:] 可打印字符 [:punct:] 标点符号字符 [:space:] 空白字符,包括垂直制表符 [:upper:] 大写字母 [:xdigit:] 十六进制数字 -
扩展正则表达式字符:
字符 含义 ? 匹配是可选的,但最多一次。即匹配某元素0次或一次。 * 匹配某元素0次或多次 + 匹配某元素1次或多次 {n} 前面的元素恰好出现n次匹配 {n,m} 前面的元素出现的次数在n~m次之间则匹配,包括n和m {n,} 前面的元素出现次数超过n次(包括n次)则匹配 {,m} 前面的元素出现次数不超过m次则匹配
-
-
写在最后:注意区分通配符和正则表达式。
因为find有-name pattern,其中pattern是通配符模式
而grep [options] PATTERN,其中PATTREN是正则表达式
正则表达式和通配符有本质区别:
- 正则表达式用来找:[文件]内容,文本,字符串。一般三剑客grep(egrep)、sed、awk支持
- 通配符用来找:文件名。普通命令都支持
如何区分正则表达式和通配符:
-
不需要思考的判断方法:在grep(egrep)、sed、awk中的都是正则表达式,其他都是通配符
-
在[[ string=~ regex ]]中是正则表达式
-
文件目录名 ====> 通配符
文件内容(字符串、文本、[文件]内容)====> 正则表达式