Linux下的六个查找命令:grep、find、locate、whereis、which、type

2015-04-06 20:14:00
admin
原创 2419
摘要:Linux下的六个查找命令:grep、find、locate、whereis、which、type
1、grep
grep(General Regular Expression Parser)是强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
使用语法:grep [选项] pattern [文件名]

. 匹配任意一个字符
* 匹配零个或多个星号前的字符
^ 匹配行开头
$ 匹配行结尾
[] 匹配方括号中任意一个字符,例如[a-z]表示匹配a到z中的任意一个字符。

\ 转意字符

(expr) 标记分组,使用\num、\-num、\g{num}、\g{-num}进行向后引用,向后引用一般用于对称匹配。

(?<name>expr) 命名标记分组,使用\g{name}、\k<name>进行向后引用,向后引用一般用于对称匹配

(?:expr) 非标记分组,分组后续无法被引用,且无法获取分组匹配的内容。

(?=pattern) 搜索前置不消耗任何字符,满足pattern才进行搜索

(?!pattern) 搜索前置不消耗任何字符不满足pattern才进行搜索


命令选项:

-r 递归目录匹配,不递归符号链接,除非是命令行参数指定的符号链接

-R 递归目录匹配,递归符号链接

-a, --text 处理二进制文件

-i 匹配不区分大小写

-b 显示字节位置
-c 显示各个文件包含模式的行数

-h 显示匹配时不显示文件名

-l 仅显示包含模式的文件名

-n 显示匹配所在的行号

-s 文件不存在或不可读时不提示错误信息

-v 显示不包含模式的行

-w 单词模式匹配

--color 匹配的颜色高亮

-A-B-C 上下文:A后看n行,B前看n行,C前后各看n行


正则表达式支持:

-G, --basic-regexp,元字符?、+、{、|、(、)需要转义使用,命令默认选项;

-E, --extended-regexp,元字符?、+、{、|、(、)可以直接使用;

-P, --perl-regexp,元字符?、+、{、|、(、)可以直接使用,并且支持\d和\w,-P有些平台可能不支持;

-F, --fixed-strings,固定字符串;


递归搜索包含BIO_new的.h和.c文件
grep -R --include=*.{h,c}  BIO_new .


搜索当前目录包含BIO_new的.h和.c文件

grep BIO_new *.{h,c}


同时搜索2个关键字BIO_new和BIO_printf

grep -E 'BIO_new|BIO_printf' *.{h,c}


显示main.cpp文件中不包含BIO_new的行:

grep -v BIO_new main.cpp


2、find
find是最强大的查找命令,可以用它找到任何你想找的文件,使用格式:
find <指定目录> <指定条件> <指定动作>
- <指定目录>: 所要搜索的目录,默认当前目录。
- <指定条件>: 所要搜索的文件特征。

- <指定动作>: 处理搜索结果,默认打印文件名。

表达式由条件和动作组合而成,可以使用逻辑操作符,逻辑操作符有三种-and、-or、!。


常用测试条件:

-user 测试文件所有者

-type 测试文件类型

-mmin 测试更新时间,按分进行比较,+n、-n与now-mtime精确比较,n与floor(now-mtime)比较,小数进位;

-mtime 测试更新时间,按天进行比较,+n、-n、n与ceil(now-mtime)比较,小数舍弃;

-size 测试文件大小

-perm 测试权限

-inum 测试文件inode


递归搜索当前目录下所有以ma开头的文件,并显示详细信息,-name匹配文件名

find . -name 'ma*' -ls


搜索当前目录下所有以tar、gz、bz2结尾的文件,-regex匹配全路径:

find . -regextype posix-extended -regex '.*.(tar|gz|bz2)'


查找系统中有set uid和set gid权限位的文件:

find /usr/bin -perm -6000 -ls


查找系统中有set uid或者set gid权限位的文件:

find /usr/bin -perm /6000 -ls


执行动作:

-exec command \; 一个文件执行一次;

-exec command {} + 多个文件执行一次,可能是全部文件;

-execdir command \; 在文件目录下执行

-execdir command {} + 在文件目录下执行


find . -name '*.cpp' -exec ./hh \; 每个文件执行一次hh,不带参数

find . -name '*.cpp' -exec ./hh {} \; 每个文件执行一次hh,带文件名

find . -name '*.cpp' -exec ./hh {} + 多个文件执行一次hh,带文件名


xargs在命令不支持多参数时非常有用,以空白和换行分割参数然后传递给命令,默认一次传递所有参数

find . -name '*.cpp' | xargs grep 'key',追加参数模式;

find | grep -E '^.+zip$' | xargs -t -I{} echo {},替换参数模式,-t表示执行每条命令前先打印命令;

find . -mtime -30  | grep -v '^.$' | xargs -t -I{} rm -rf {},删除目录下30天内创建的文件,乱码文件也可以被删除;


3、locate

locate命令作用相当于find -name,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/locatedb,这个数据库包含本地所有文件信息。linux系统自动创建这个数据库,并且每天自动更新一次,所以locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。


locate命令参数:

-r 正则表达式

-i 忽略大小写


搜索etc目录下所有以sh开头的文件:

locate /etc/sh


搜索用户主目录下所有以m开头的文件:

locate -i ~/m

4、whereis
whereis命令用于搜索命令、帮助文件、源码,-b搜索命令,-m搜索帮助文件,-s搜索源码,默认搜索所有信息。

whereis grep
grep: /bin/grep /usr/share/man/man1p/grep.1p.gz /usr/share/man/man1/grep.1.gz

5、which
which命令的作用是,在PATH变量指定的路径中搜索某个系统命令的位置,并且返回第一个搜索结果。使用which命令,可以看到某个系统命令是否存在,以及执行的是哪一个命令。

which grep

/bin/grep


6、type

用来显示命令详情,-a显示所有类型,aliases、builtins、functions。


type ls
ls is aliased to `ls --color=auto'


type -a ls

ls is aliased to `ls --color=auto'
ls is /bin/ls

发表评论
评论通过审核之后才会显示。