查找与统计
- grep
- 正则表达式
- 返回值
- 示例
- zgrep
- find
- 常规选项
- 筛选选项
- 操作选项
- 实用示例
- wc
- 实用示例
grep
grep命令用于在文件中或者标准输出中搜索特定字符串,并显示匹配结果。
grep全称:Global Regular Expression Print
基本语法:
grep[OPTION]... PATTERN[FILE]...- 默认情况下,PATTERN 是一个基本正则表达式(Basic Regular Expression);
- 配合
|可以在标准输出中进行字符串检索;
示例1:
###grep-i'hello world'memu.h main.c###grep-i'hello world'*.c选项
| options | full name | Usage |
|---|---|---|
| -c | count | 仅显示特定字符串所在行的行号 |
| -i | ignore case | 忽略大小写 |
| -n | number | 显示行号 |
| -v | invert | 反向选择,仅列出没有特定字符串的行 |
| -r | recursive | 递归搜索文件目录(terminal 显示路径和搜索到内容) |
| -E | Extended regexp | 使用拓展的正则表达式 (grep -E=egrep) |
| -l | - | 仅显示包含特定字符串的文件的名称 |
| -C n | Context | 打印匹配行的前后n行 |
| -f file | - | 从 file 中获取 PATTERN 进行匹配 |
| -m n | match | 匹配到第 n 个之后停止 |
| -A NUM | After | –after-context=NUM,除了列出符合行之外,并且列出后NUM行。 |
正则表达式
基本正则表达式
| Expression | Usage |
|---|---|
| . | 匹配任意单个字符。 |
| * | 匹配前一个字符零次或多次 |
| [ ] | 匹配括号内的任意一个字符 |
| [^ ] | 匹配括号内以外的任意一个字符 |
| \ | 转义字符,用于匹配特殊字符) |
| ^ | 匹配行首 |
| & | 匹配行尾 |
| I | 或运算符 |
| ( ) | 分组运算符 |
拓展正则表达式
| Expression | Usage |
|---|---|
| + | 匹配前一个字符一次或多次 |
| ? | 匹配前一个字符零次或一次 |
| { } | 匹配前一个字符指定次数 |
返回值
在 shell 中,使用$?可以得到前一条命令执行结果的返回值,返回值为 0 表示命令执行成功,否则命令执行失败。
对于grep命令而言,如果查找到目标字符串,返回值为 0,没有找到目标字符串,返回值为 1 。
返回值主要用于 Shell 编程中。
示例
① 对多个文件进行检索的时候,会显示文件名和特定字符串所在行的完整内容。
② 遍历当前目录下的所有文件,包含子目录中的文件,并进行搜索。
grep-r'module'./*③ 使用-f选项
④ 同时使用多个选项
⑤ 正则表达式的使用
注意使用转义字符。
⑥ 使用-m选项获取某个目录下时间最新的文件或文件夹
ls-tpathname|grep-m1"string_to_find"# csh 中将命令的执行结果赋值给变量setnetlist_dir=`ls-tpathname|grep-m1"string_to_find"`zgrep
grep命令不能作用于压缩文件(以gz为后缀的文件),需要先将其解压,然后再使用。但是,zgrep命令可以直接作用于压缩文件。
zgrep是grep命令的拓展,它的用法和grep命令完全相同。
对于只使用gzip命令压缩的文件,可以直接使用zgrep命令,如下所示:
zgrep"string_to_search"test_file.gz对于使用tar命令进行打包并压缩的文件,可以使用如下方式:
zcat test_file.tar.gz|grep- a"string_to_search"zgrep-a"string_to_search"test_file.tar.gzzcat的作用是解压文件并将内容输出到标准输出。
find
find命令用于在指定的目录及其子目录中查找符合条件的文件和目录。它支持复杂的搜索条件组合,并能对搜索结果执行各种操作,
grep是在文件中找字符串,find是在目录下找文件或者其他内容。
基本语法:
find[path...][CONDITION][OPERATION]- path:指定 find 命令开始搜索的目录,可以是一个或多个路径。如果不指定路径,默认是当前目录及其所有子目录。
- CONDITION:定义要查找的文件或目录的属性,如名称、类型、大小、时间等。
- OPERATION:对搜索结果执行的操作,如打印、删除、移动、执行等
示例:
find./*-name"*.v"命令的执行结果示例如下:
该命令用于搜索当前目录下以.v为后缀的所有文件,它会自动对子目录进行检索,最终输出目标文件的相对路径。
常规选项
find命令的选项可以分为两部分,一个是查找文件的选项,另一个是找到文件之后,对其进行某种操作的选项。
筛选选项
常用的文件筛选选项如下表:
| options | Usage |
|---|---|
| -name pattern | 根据文件名进行查找,pattern 中支持通配符*、?、[]。(?匹配单个字符) |
| -iname pattern | 根据文件名进行查找,忽略大小写 |
| -type type | 根据文件类型进行查找,f表示文件,d表示目录,l表示链接 |
| -size n/+n/-n | 根据文件大小进行查找,+n表示文件大于某个值,比如 10M,-n表示文件小于某个值,n则是等于 |
| -depth | 先搜索子目录,再搜索当前目录 |
| -maxdepth | 搜索的最大深度 |
| -perm | 根据权限搜索文件,例如 -perm 755 |
| -mtime/mmin | 根据修改时间查找,+time_value 表示该时间值以内,- 表示以外。-mtime 是按天数,-mmin 是按分钟。 |
| -regex/iregex | 使用正则表达式匹配文件路径,-iregex是正则表达式不分区大小写 |
| -user/-group | 按用户明或者组进行搜索 |
逻辑运算
find命令中也可以使用逻辑运算。
逻辑与
and或-a(默认连接符)find.-typef-name"*.txt"-size10M逻辑与是默认连接符,所有在命令中可以直接省略。
逻辑或:
-or或-ofind.-name"*.txt"-or-name"*.md"逻辑非:
-not或!find.-typef!-name"*.log"括号
find.\(-name"*.txt"-o-name"*.md"\)-and-size+1M括号用于组合多个条件,需要对其进行转义。
示例
# 按时间查找find.-mtime-7# 查找最近 7 天内修改的文件find.-mtime+30# 查找 30 天前修改的文件find.-mmin-60# 查找过去 60 分钟内修改的文件操作选项
find命令可以对文件执行的操作如下:
| options | Usage |
|---|---|
| 打印搜索结果,默认行为 | |
| -printf | 自定义输出格式 |
| -delete | 找到文件后,将其删除。-delete需要位于条件的最后,且不可与-print或其他输出操作同时使用 |
| -exec coomand {} \; | 对每个匹配到的文件执行指定的命令。{}代表当前文件,命令结尾以\;(逐次执行) 或+(批量执行)结束。 |
| -ok coomand {} \; | 用法和-exec一样,但是在执行前会提示用户确认 |
-printf中常用的格式符如下:
-exec命令中的\;表示逐次执行,意思是每找到一个文件,执行一次命令;+表示批量执行,将多个文件作为参数一次性传递给命令。
示例:
## 找到一个文件,执行一次命令find.-typef-name"*.log"-execrm{}\;## 将多个文件作为参数一次性传递给命令find.-typef-name"*.log"-okrm{}+实用示例
- 递归查看目录下所有文件的时间
使用find命令配合ls命令,可以递归查看某个目录下所有文件的更新时间:
find/path/to/dir-typef-execls-lrt{}+其中,-exec ls -lrt {} +是对找到的文件所有文件执行ls -lrt命令。
- 查找文件内容包含特定字符串的文件
find命令配合gerp命令可以实现按文件内容查找文件:
find.-typef-execgrep-l"seaech_srting"{}+- 查找并删除 30 天前的日志文件
find/var/log-typef-name"*.log"-mtime+30-execrm{}\;- 查找并打印文件的完整路径
find.-typef-name"*.v"-printf"%p\n"- 查找并移动所有 PDF 文件到另一个目录
find.-typef-name"*.pdf"-execmv{}/path/to/destination/\;wc
统计文件或者标准输出的行数、字数(word)或字节(Byte)数。
基本语法
wc[OPTION]...[FILE]...- 可以同时指定多个文件
- 如果文件名是
-,或者没有指定文件名称,则wc会从标准输出中读取数据并统计数量。 - 这里的 word 指的是以空白符为分界的连续的字符串。(A word is non-zero-length sequence of characters delimited by white space.)
wc默认统计行数、字数和字节数,统计单个文件的结果如下:
14 23 147 依次是行数、字数和字节数。
同时统计多个文件时,最后会有一个统计值。
选项
| options | Usage |
|---|---|
| -l | 统计行数 |
| -w | 统计字数 |
| -c | 统计字节数 |
| -m | 统计字符的数量(character counts) |
| -L | 最长行的长度 |
实用示例
wc命令往往是配合其他命令(grep、|等)一起使用,具体示例如下。
① 统计某个文件中 Error 的数量:
grep"Error"tk_scan.log|wc-l② 统计当前目录下文件的数量(不包含子目录)
ls-l|grep"^-"|wc-l③ 统计当前目录下文件的数量(包含子目录)
ls-lR|grep"^-"|wc-l④ 查看某目录下文件夹(目录)的个数(包括子目录)
ls-lR|grep"^d"|wc-l⑤ 统计当前文件夹下某个文件或某种后缀名称的文件的数量
find.-namefilename|wc-l#find.-name"*.v"|wc-l