linux下find和grep命令详解
在linux下⾯⼯作,有些命令能够⼤⼤提⾼效率。本⽂就向⼤家介绍find、grep命令,他哥俩可以算是必会的linux命令,我⼏乎每天都要⽤到他们。本⽂结构如下:
find命令
find命令的⼀般形式
find命令的常⽤选项及实例
find与xargs
grep命令
grep命令的⼀般形式
grep正则表达式元字符集(基本集)
grep命令的常⽤选项及实例
1、find命令
find命令是⼀个⽆处不在命令,是linux中最有⽤的命令之⼀。find命令⽤于:在⼀个⽬录(及⼦⽬录)中搜索⽂件,你可以指定⼀些匹配条件,如按⽂件名、⽂件类型、⽤户甚⾄是时间戳查⽂件。下⾯就通过实例来体验下find命令的强⼤。
1.1、find命令的⼀般形式
man⽂档中给出的find命令的⼀般形式为:
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [] [expression]
其实[-H] [-L] [-P] [-D debugopts] [-Olevel]这⼏个选项并不常⽤(⾄少在我的⽇常⼯作中,没有⽤到过),上⾯的find命令的常⽤形式可以简化为:find查命令的使用
find [] [expression]
path:find命令所查的⽬录路径。例如⽤.来表⽰当前⽬录,⽤/来表⽰系统根⽬录
expression:expression可以分为——“-options [-print -exec -ok ...]”
-options,指定find命令的常⽤选项,下节详细介绍
-
print,find命令将匹配的⽂件输出到标准输出
-exec,find命令对匹配的⽂件执⾏该参数所给出的shell命令。相应命令的形式为'command' { } \;,注意{ }和\;之间的空格
find ./ -size 0 -exec rm {} \; 删除⽂件⼤⼩为零的⽂件(还可以以这样做:rm -i `find ./ -size 0` 或 find ./ -size 0 | xargs rm -f &)
为了⽤ls -l命令列出所匹配到的⽂件,可以把ls -l命令放在find命令的-exec选项中:find . -type f -exec ls -l { } \;
在/logs⽬录中查更改时间在5⽇以前的⽂件并删除它们:find /logs -type f -mtime +5 -exec rm { } \;
-ok,和-exec的作⽤相同,只不过以⼀种更为安全的模式来执⾏该参数所给出的shell命令,在执⾏每⼀个命令之前,都会给出提⽰,让⽤户来确定是否执⾏。
find . -name "*.conf" -mtime +5 -ok rm { } \; 在当前⽬录中查所有⽂件名以.LOG结尾、更改时间在5⽇以上的⽂件,并删除它们,只不过在删除之前先给出提⽰
也有⼈这样总结find命令的结构:
find start_directory test
options
criteria_to_match
action_to_perform_on_results
1.2、find命令的常⽤选项及实例
-name
按照⽂件名查⽂件。
find /dir -name filename 在/dir⽬录及其⼦⽬录下⾯查名字为filename的⽂件
find . -name "*.c" 在当前⽬录及其⼦⽬录(⽤“.”表⽰)中查任何扩展名为“c”的⽂件
-perm
按照⽂件权限来查⽂件。
find . -perm 755 –print 在当前⽬录下查⽂件权限位为755的⽂件,即⽂件属主可以读、写、执⾏,其他⽤户可以读、执⾏的⽂件-prune
使⽤这⼀选项可以使find命令不在当前指定的⽬录中查,如果同时使⽤-depth选项,那么-prune将被find命令忽略。
find /apps -path "/apps/bin" -prune -o –print 在/apps⽬录下查⽂件,但不希望在/apps/bin⽬录下查
find /usr/sam -path "/usr/sam/dir1" -prune -o –print 在/usr/sam⽬录下查不在dir1⼦⽬录之内的所有⽂件
-user
按照⽂件属主来查⽂件。
find ~ -user sam –print 在$HOME⽬录中查⽂件属主为sam的⽂件
-group
按照⽂件所属的组来查⽂件。
find /apps -group gem –print 在/apps⽬录下查属于gem⽤户组的⽂件
-mtime -n +n
按照⽂件的更改时间来查⽂件, - n表⽰⽂件更改时间距现在n天以内,+ n表⽰⽂件更改时间距现在n天以前。
find / -mtime -5 –print 在系统根⽬录下查更改时间在5⽇以内的⽂件
find /var/adm -mtime +3 –print 在/var/adm⽬录下查更改时间在3⽇以前的⽂件
-nogroup
查⽆有效所属组的⽂件,即该⽂件所属的组在/etc/groups中不存在。
find / –nogroup -print
-nouser
查⽆有效属主的⽂件,即该⽂件的属主在/etc/passwd中不存在。
find /home -nouser –print
-newer file1 ! file2
查更改时间⽐⽂件file1新但⽐⽂件file2旧的⽂件。
-type
查某⼀类型的⽂件,诸如:
b - 块设备⽂件。
d - ⽬录。
c - 字符设备⽂件。
p - 管道⽂件。
l - 符号链接⽂件。
f - 普通⽂件。
find /etc -type d –print 在/etc⽬录下查所有的⽬录
find . ! -type d –print 在当前⽬录下查除⽬录以外的所有类型的⽂件
find /etc -type l –print 在/etc⽬录下查所有的符号链接⽂件
-size n:[c] 查⽂件长度为n块的⽂件,带有c时表⽰⽂件长度以字节计。
find . -size +1000000c –print 在当前⽬录下查⽂件长度⼤于1 M字节的⽂件
find /home/apache -size 100c –print 在/home/apache⽬录下查⽂件长度恰好为100字节的⽂件
find . -size +10 –print 在当前⽬录下查长度超过10块的⽂件(⼀块等于512字节)
-depth:在查⽂件时,⾸先查当前⽬录中的⽂件,然后再在其⼦⽬录中查。
find / -name "CON.FILE" -depth –print 它将⾸先匹配所有的⽂件然后再进⼊⼦⽬录中查
-mount:在查⽂件时不跨越⽂件系统mount点。
find . -name "*.XC" -mount –print 从当前⽬录开始查位于本⽂件系统中⽂件名以XC结尾的⽂件(不进⼊其他⽂件系统)
-follow:如果find命令遇到符号链接⽂件,就跟踪⾄链接所指向的⽂件。
1.3、find与xargs
在使⽤find命令的-exec选项处理匹配到的⽂件时, find命令将所有匹配到的⽂件⼀起传递给exec执⾏。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运⾏⼏分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的⽤处所在,特别是与find命令⼀起使⽤。
find命令把匹配到的⽂件传递给xargs命令,⽽xargs命令每次只获取⼀部分⽂件⽽不是全部,不像-exec选项那样。这样它可以先处理最先获取的⼀部分⽂件,然后是下⼀批,并如此继续下去。
在有些系统中,使⽤-exec选项会为处理每⼀个匹配到的⽂件⽽发起⼀个相应的进程,并⾮将匹配到的⽂件全部作为参数⼀次执⾏;这样在有些情况下就会出现进程过多,系统性能下降的问题,因⽽效率不⾼;
⽽使⽤xargs命令则只有⼀个进程。另外,在使⽤xargs命令时,究竟是⼀次获取所有的参数,还是分批取得参数,以及每⼀次获取参数的数⽬都会根据该命令的选项及系统内核中相应的可调参数来确定。
来看看xargs命令是如何同find命令⼀起使⽤的,并给出⼀些例⼦。
find . -type f -print | xargs file 查系统中的每⼀个普通⽂件,然后使⽤xargs命令来测试它们分别属于哪类⽂件
find / -name "core" -print | xargs echo "" >/tmp/core.log 在整个系统中查内存信息转储⽂件(core dump) ,然后把结果保存到/tmp/core.log ⽂件中:
find . -type f -print | xargs grep "hostname" ⽤grep命令在所有的普通⽂件中搜索hostname这个词
find ./ -mtime +3 -print|xargs rm -f –r 删除3天以前的所有东西(find . -ctime +3 -exec rm -rf {} \;)
find ./ -size 0 | xargs rm -f & 删除⽂件⼤⼩为零的⽂件
find命令配合使⽤exec和xargs可以使⽤户对所匹配到的⽂件执⾏⼏乎所有的命令。
2、grep命令
grep (global search regular expression(RE) and print out the line,全⾯搜索正则表达式并把⾏打印出来)是⼀种强⼤的⽂本搜索⼯具,它能使⽤正则表达式搜索⽂本,并把匹配的⾏打印出来。
2.1、grep命令的⼀般选项及实例
grep [OPTIONS] PATTERN []
grep [OPTIONS] [-e PATTERN | -f FILE] []
grep命令⽤于搜索由Pattern参数指定的模式,并将每个匹配的⾏写⼊标准输出中。这些模式是具有限定的正则表达式,它们使⽤ed或egrep 命令样式。如果在File参数中指定了多个名称,grep命令将显⽰包含匹配⾏的⽂件的名称。对 shell 有特殊含义的字符 ($, *, [, |, ^, (, ), \ ) 出现在 Pattern参数中时必须带双引号。如果 Pattern参数不是简单字符串,通常必须⽤单引号将整个模式括起来。在诸如 [a-z], 之类的表达式中,-(减号)cml 可根据当前正在整理的序列来指定⼀个范围。整理序列可以定义等价的类以供在字符范围中使⽤。如果未指定任何⽂件,grep会假定为标准输⼊。
2.2、grep正则表达式元字符集(基本集)
^ 锚定⾏的开始如:'^grep'匹配所有以grep开头的⾏。
$ 锚定⾏的结束如:'grep$'匹配所有以grep结尾的⾏。
. 匹配⼀个⾮换⾏符的字符如:'gr.p'匹配gr后接⼀个任意字符,然后是p。
* 匹配零个或多个先前字符如:' *grep'匹配所有⼀个或多个空格后紧跟grep的⾏。 .*⼀起⽤代表任意字符。
[] 匹配⼀个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。
[^] 匹配⼀个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-F和H-Z的⼀个字母开头,紧跟rep的⾏。
\(..\) 标记匹配字符,如:'\(love\)',love被标记为1。
\< 锚定单词的开始,如:'\<grep'匹配包含以grep开头的单词的⾏。
\> 锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的⾏。
x\{m\} 连续重复字符x,m次,如:'o\{5\}'匹配包含连续5个o的⾏。
x\{m,\} 连续重复字符x,⾄少m次,如:'o\{5,\}'匹配⾄少连续有5个o的⾏。
x\{m,n\} 连续重复字符x,⾄少m次,不多于n次,如:'o\{5,10\}'匹配连续5--10个o的⾏。
\w 匹配⼀个⽂字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个⽂字或数字字符,然后是p。
\W w的反置形式,匹配⼀个⾮单词字符,如点号句号等。\W*则可匹配多个。
\b 单词锁定符,如: '\bgrep\b'只匹配grep,即只能是grep这个单词,两边均为空格。
2.3、grep命令的常⽤选项及实例
-?
同时显⽰匹配⾏上下的?⾏,如:grep -2 pattern filename同时显⽰匹配⾏的上下2⾏。
-b,--byte-offset
打印匹配⾏前⾯打印该⾏所在的块号码。
-c,--count
只打印匹配的⾏数,不显⽰匹配的内容。
-f File,--file=File
从⽂件中提取模板。空⽂件中包含0个模板,所以什么都不匹配。
-h,--no-filename
当搜索多个⽂件时,不显⽰匹配⽂件名前缀。
-i,--ignore-case
忽略⼤⼩写差别。
-q,--quiet
取消显⽰,只返回退出状态。0则表⽰到了匹配的⾏。
-l,--files-with-matches
打印匹配模板的⽂件清单。
-L,--files-without-match
打印不匹配模板的⽂件清单。
-n,--line-number
在匹配的⾏前⾯打印⾏号。
-
s,--silent
不显⽰关于不存在或者⽆法读取⽂件的错误信息。
-v,--revert-match
反检索,只显⽰不匹配的⾏。
-w,--word-regexp
如果被\<;和\>引⽤,就把表达式做为⼀个单词搜索。
-V,--version
显⽰软件版本信息。
=====
ls -l | grep '^a' 通过管道过滤ls -l输出的内容,只显⽰以a开头的⾏。
grep 'test' d* 显⽰所有以d开头的⽂件中包含test的⾏。
grep 'test' aa bb cc 显⽰在aa,bb,cc⽂件中匹配test的⾏。
grep '[a-z]' aa 显⽰所有包含每个字符串⾄少有5个连续⼩写字符的字符串的⾏。
grep 'w(es)t.*' aa 如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.*),这些字符后⾯紧跟着另外⼀个es(),到就显⽰该⾏。如果⽤egrep或grep -E,就不⽤""号进⾏转义,直接写成'w(es)t.*'就可以了。
grep -i pattern files :不区分⼤⼩写地搜索。默认情况区分⼤⼩写
grep -l pattern files :只列出匹配的⽂件名,
grep -L pattern files :列出不匹配的⽂件名,
grep -w pattern files :只匹配整个单词,⽽不是字符串的⼀部分(如匹配‘magic’,⽽不是‘magical’),
grep -C number pattern files :匹配的上下⽂分别显⽰[number]⾏,
grep pattern1 | pattern2 files :显⽰匹配 pattern1 或 pattern2 的⾏,
grep pattern1 files | grep pattern2 :显⽰既匹配 pattern1 ⼜匹配 pattern2 的⾏。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论