`

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] [path...] [expression]

其实[-H] [-L] [-P] [-D debugopts] [-Olevel]这几个选项并不常用(至少在我的日常工作中,没有用到过),上面的find命令的常用形式可以简化为:

find [path...] [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 [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [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 的行。

 

参考文献:

 

文章来自:http://www.cnblogs.com/skynet/archive/2010/12/25/1916873.html

并非本人所写,个人觉得总结的很好,所以就转载过来,留了地址了。如有异议,请知会我,我会第一时间删除。

分享到:
评论

相关推荐

    文本查找和筛选工具(grep,find,sed)

    文本查找和筛选工具(grep,find,sed),介绍这三个命令的参数用法和大量实例

    find的用法很有用

    linux系统命令个人觉得很有用,仅适应linux系统 。

    Windows下使用的常用Linux命令集

    在Windows下,有些操作很不方便,因为没有Linux下强大的命令,比如grep、find、sed、tail、chmod等,本包就是可以让Windows直接支持一些常用的Linux命令。 使用方法: 解压“win32linux.zip”到任意目录,然后把该...

    LINUX操作系统(电子教案,参考答案)

    2.2.8 寻找命令使用方法 18 2.3 退出Linux 19 2.3.1 注销 19 2.3.2 关闭系统 19 小结 20 习题二 21 一、思考题 21 二、选择题 21 三、上机操作 21 第3章 树型结构 23 3.1 文件 23 3.1.1 Linux的文件 23 3.1.2 文件...

    Linux查找替换文本编辑常用命令汇总

    Linux中tail,find,grep,sed,awk等,各个查找替换,常用命令,可以很好 的了解tail,find,grep,sed,awk等各个命令的各个参数的含义和用法,掌握Linux下查找替换的功能

    Linux从零入门实战-2019年七月Z线.txt

    知识点5: find 与 grep:搜索神器find命令基本用法 知识点6: tar命令 知识点7: ssh和sshd 实战项目: ssh登陆到你的Linux系统,使用find、grep、tar等常用命令解决具体问题 第二阶段 Linux开发基础与shell编程 ...

    linux必须的60个命令

    Linux提供了大量的命令,利用它可以有效地完成大量的工 ...本文以Mandrake Linux 9.1(Kenrel 2.4.21)为例,介绍Linux下的安装和登录命令。 immortality按:请用ctrl+f在本页中查找某一部分的内容或某一命令的用法。

    shell编程指南,shell脚本,本书共分五部分全。grep家族,sed,AWK,正则表达式,tr用法

    第2章 使用find和xargs 14 第3章 后台执行命令 22 第4章 文件名置换 31 第5章 shell输入与输出 34 第6章 命令执行顺序 46 第二部分 文本过滤 第7章 正则表达式介绍 49 第8章 grep家族 56 第9章 AWK介绍 66 第10章 ...

    linux基本命令指南

    介绍了linux下基本命令的用法,如grep, Regular Expression, find等等,非常实用

    Linux 常用操作命令大全(最后更新时间:2024年1月).md

    另外还总结了find、whereis、which、sudo、grep等实用工具命令,以及系统管理中的防火墙设置、主机名修改、网络配置、进程管理等常见任务的相关命令使用方式。 总的来说,这是一份内容丰富、知识面广、实用性强的...

    linux内核调试分析指南

    find + grep wine + SI global Source-Navigator vim + cscope/ctags kscope lxr SI等与gdb的特点 调用链、调用树和调用图 理想调用链 函数指针调用 调用链的层次 非理想调用链 调用树与调用图 穿越盲区 穿越gdb的...

    基础的Linux常用命令

    注:按q键或者ctrl+c退出,在linux下可以使用ctrl+c终止当前程序运行。 2. ls 查看目录或者文件的属*,列举出任一目录下面的文件 eg: ls /usr/man ls -l a.d表示目录(directory),如果是一个"-"表示是文件,如果...

    LINUX与UNIX SHELL编程指南

    第2章使用find和xargs.PDF 第3章后台执行命令.PDF 第4章文件名置换.PDF 第5章shell输入与输出.PDF 第6章命令执行顺序.PDF 第7章正则表达式介绍.PDF 第8章grep 家族.PDF 第9章AWK 介绍.PDF 第10章sed 用法介绍.PDF 第...

    LINUX与UNIX SHELL编程指南(很全)

    第2章 使用find和xargs 14 2.1 find命令选项 14 2.1.1 使用name选项 15 2.1.2 使用perm选项 16 2.1.3 忽略某个目录 16 2.1.4 使用user和nouser选项 16 2.1.5 使用group和nogroup选项 16 2.1.6 按照更改时间查找文件 ...

    linux模糊查找文件用什么命令比较好

    本文主要讲解如何在Linux系统下使用命令行工具模糊查找文件,本文的工具包括find命令的用法也介绍grep命令的使用方法,同时也有find与grep两者结合,能更精确根据条件查找文件。 2. 根据文件名模糊查找文件 例如...

    Linux shell编程指南

    第2章 使用find和xargs 14 2.1 find命令选项 14 2.1.1 使用name选项 15 2.1.2 使用perm选项 16 2.1.3 忽略某个目录 16 2.1.4 使用user和nouser选项 16 2.1.5 使用group和nogroup选项 16 2.1.6 按照更改时间查找文件 ...

    Linux与unix shell编程指南

    第2章 使用find和xargs 14 2.1 find命令选项 14 2.1.1 使用name选项 15 2.1.2 使用perm选项 16 2.1.3 忽略某个目录 16 2.1.4 使用user和nouser选项 16 2.1.5 使用group和nogroup选项 16 2.1.6 按照更改时间查找文件 ...

Global site tag (gtag.js) - Google Analytics