zl程序教程

您现在的位置是:首页 >  工具

当前栏目

find和grep命令详解程序员

命令程序员 详解 Find grep
2023-06-13 09:19:56 时间

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

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

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

  选项  含义

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

  -follow  跟随符号链接

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

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

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

  测试  含义

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

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

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

  -newer otherfile  文件比otherfile文件更新

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

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

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

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

  !  -not  测试取反

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

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

还可以通过使用圆括号来强制测试和操作符的优先级。由于圆括号对于shell来说有其特殊含义,所以必须使用反斜线来引用圆括号。此外,如果你在文件名处使用的是匹配模式,你就必须在模式上使用引号以确保模式没有被shell扩展,而是直接传递给find命令。

例如:  “搜索的文件比文件X更新,或者文件名以下划线开头”  −newerX−o−name“∗”−newerX−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  取消每个输出行的普通前缀,即匹配查询模式的文件名

  -me  忽略大小写

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

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

例如:

[email protected]:~/code/Shell$ grep # she_*

she_1:#!/bin/sh

she_10:#!/bin/sh

she_11:#!/bin/sh

[email protected]:~/code/Shell$ grep -c # she_*

she_1:1

she_10:1

she_11:1

[email protected]:~/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}  匹配次数在n到m之间,包括n和m

例:

  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个字符长的全部由消协字母组成的单词

资料来源:

https://blog.csdn.net/zhuyi2654715/article/details/7549213

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/1853.html

服务器部署程序员系统优化网站设置运维