Linux笔记 find和grep命令

时间:2022-01-02 22:06:51

find命令用于搜索文件。其完整语法为:find [path] [options] [tests] [actions]

path是要搜索的路径,可以是绝对路径也可以是相对路径。

options有许多选项可用,以下列出一些主要的选项

                   选项                                               含义

                   -depth                                    在查看目录本身之前先搜索目录的内容

                   -follow                                  跟随符号链接

                   -maxdepths  N                    最多允许搜索N层目录

                   -mout(-xdev)                     不搜索其他文件系统中的目录

tests(测试)部分:可以提供给find命令的测试非常多,每种测试返回的结果有两种可能:truefalsefind开始工作时候,它按照顺序将定义的每种测试依次应用到它搜索到的每个文件上。如果一个测试返回falsefind命令就停止处理它当前找到的这个文件,并继续搜索。如果一个测试返回truefind命令将继续下一个测试或对当前文件采取行动。最常用的测试如下表:

                   测试                                                        含义

                   -atime N                                         文件在N天之前被最后访问过

                   -mtime N                                        文件在N天之前被最后修改过

                   -name  pattern                               文件名(不包括路径名)匹配提供的模式pattern,为了确保                                                                         pattern被传递给find命令而不是shell来处理,pattern必须总是                                                                   用引号括起

                   -newer otherfile                              文件比otherfile文件更新

                   -type          c                                            文件的类型为cc是一个特殊类型。最常见的是d(目录)和                                                                     f(普通文件)。

                   -user username                               文件的拥有者是制定的用户username

可以用操作符来组合测试。大多数操作符有两种格式:短格式和长格式

                   操作符,短格式                  操作符,长格式                   含义

                            !                                             -not                     测试取反

                            -a                                            -and                    两个测试都必须为真

                            -o                                           -or                      两个测试有一个必须为真

还可以通过使用圆括号来强制测试和操作符的优先级。由于圆括号对于shell来说有其特殊含义,所以必须使用反斜线来引用圆括号。此外,如果你在文件名处使用的是匹配模式,你就必须在模式上使用引号以确保模式没有被shell扩展,而是直接传递给find命令。例如:  “搜索的文件比文件X更新,或者文件名以下划线开头”                   \(-newer X -o -name “_*”\)

在发现匹配指定条件的文件之后,可以执行的最常用的动作:

                   动作                                               含义

                   -exec command                     执行一条命令。这是最常见的动作之一。该动作必须使用\;字符对来                                                          结束

                   -ok  command                     -exec类似,但它在执行命令之前会针对每个要处理的文件,提示                                                           用户进行确认。这个动作必须使用\;字符结束

                   -print                                     打印文件名

                   -ls                                          对当前文件使用命令 ls -dils

另外魔术字符串{}-exec-ok命令的一个特殊类型的参数,它将被当前文件的完整路径取代。

例:

         $ find . -newer while2 -type f -exec ls -l {} \;            搜索比while2更新的且类型是普通文件的文件,搜索到时打印该文件的信息                

 

grep命令   (通用正则表达式解析器)。使用grep命令可在文件中搜索字符串。一种非常常见的用法是在使用find命令时,将grep作为传递给-exec的一条命令。

grep命令使用一个选项、一个要匹配的模式和要搜索的文件,语法如下所示:

         grep [options] PATTERN [FILES]

如果没有提供文件名,则grep命令将搜索标准输入。Grep命令的一些主要选项如下:

                   选项                                               含义

                   -c                                           输出匹配行的数目,而不是输出匹配的行

                   -E                                          启用扩展表达式

                   -h                                          取消每个输出行的普通前缀,即匹配查询模式的文件名

                   -i                                           忽略大小写

                   -l                                           只列出包含匹配行的文件名,而不输出真正的匹配行

                   -v                                          对匹配模式取反,即搜索不匹配行而不是匹配行

例如:

shmily@pc-Shmily:~/code/Shell$ grep '#' she_*

she_1:#!/bin/sh

she_10:#!/bin/sh

she_11:#!/bin/sh

shmily@pc-Shmily:~/code/Shell$ grep -c '#' she_*

she_1:1

she_10:1

she_11:1

shmily@pc-Shmily:~/code/Shell$ grep -c -v '#' she_*

she_1:15

she_10:18

she_11:3

正则表达式:在使用正则表达式的过程中,一些字符是以特定方式处理的。最常使用的特殊字符如下:

         字符                                                                  含义

         ^                                                     指向一行的开头

         $                                                     指向一行的结尾

         .                                                      任意单个字符

         []                                                    方括号内包含一个字符范围,其中任何一个字符都可以被匹配,例                                                            如字符范围a~e,或在字符范围前加上^符号表示使用反向字符范围,                                                               即不匹配指定范围内的字符

如果想将上述字符用作普通字符,就需要在它们前面加上\字符。

在方括号中还可以使用一些有用的特殊匹配模式,如下表:

         匹配模式                                                          含义

         [:alnum:]                                         字母与数字字符

         [:alpha:]                                          字母

         [:ascii:]                                            ASCII字符

         [:blank:]                                          空格或制表符

         [:cntrl:]                                            ASCII控制字符

         [:digit:]                                           数字

         [:graph:]                                         非控制、非空格字符

         [:lower:]                                         小写字母

         [:print:]                                           可打印字符

         [:punct:]                                          标点符号字符

         [:space:]                                          空白字符,包括垂直制表符

         [:upper:]                                         大写字母

         [:xdigit:]                                         十六进制数字

如果指定了用于扩展匹配的-E选项,那些用于控制匹配完成的其他字符可能会遵循正则表达式规则。对于grep命令来说,我们还需要在这些字符之前加上\字符。

         选项                                                                  含义

         ?                                                     匹配是可选的,最多匹配一次

         *                                                     必须匹配0次或多次

         +                                                     必须匹配1次或多次

         {n}                                                 必须匹配n

         {n,}                                                必须匹配n次或n次以上

         {n, m}                                            匹配次数在nm之间,包括nm

:

         grep e$ words2.txt                         查找以字母e结尾的行

         grep a[[:blank:]] word2.txt             查找以a结尾的单词

         grep Th.[[:space:]] word2.txt         查找以Th开头的由3个字母组成的单词

         grep -E [a-z]\{10\} word2.txt         查找只有10个字符长的全部由消协字母组成的单词