前言: Linux操作中总是会用到查找操作,无论是查找文件、目录,还是查找文件中的内容等。grep命令用于在某个文件文本中查找指定的字符串,类似于word中的ctrl+F,而find命令用于在某个指定的目录中查找某个文件或某个目录。
一、grep
1. grep命令相关参数
用于在某个文件文本中通过正则表达式来查找指定的字符串。当grep被用在shell命令中,正则表达式应该被引号引起来。
–color=auto 或者 –color:表示对匹配到的文本着色显示
-i:即--ignore-case在搜索的时候忽略大小写
-n:显示结果所在行号
-c:统计匹配到的行数,将不会显示匹配的结果,注意,是匹配到的总行数,不是匹配到的次数,
-o:只显示符合条件的字符串,但是不整行显示,每个符合条件的字符串单独显示一行
-v:输出不带关键字的行(反向查询,反向匹配)
-w:即--word-regexp匹配整个单词,如果是字符串中包含这个单词,则不作匹配。精确搜索
-Cx:即--context=NUM在输出的时候包含结果所在行之前和之后的指定行数,这里指之前和之后的x行,C:context
-e:实现多个选项的匹配,逻辑or关系
-s: 忽略相关不存在或无法读取等错误信息
-E:即--extended-regexp 以扩展的正则表达式进行解析(EREs)
-F:即 --fixed-strings,以固定字符串进行解析
-G:即 --basic-regexp 以基础的正则表达式进行解析,这是默认的
-P:即 --perl-regexp 以兼容perl的正则表达式进行解析
-H: 即 --with-filename 打印每一个匹配的文件名,当多个文件搜索时候这是默认的。
2.grep相关例子
grep相关命令格式:
grep [OPTION...] PATTERNS [FILE...]
grep [OPTION...] -e PATTERNS ... [FILE...]
grep [OPTION...] -f PATTERN_FILE ... [FILE...]
例子一:忽略大小写和输出行数
在Helloworld.c文件中搜索main函数,i 代表忽略大小写,n代表输出行号
# grep -in "main" Helloworld.c
3:void main(){
一般默认会以颜色突出关键词,如没有,可以使用 --color
例子二: 输出数量
只想知道有多少行包含指定的字符串,而不在乎哪些行包含这些字符串,使用”-c”选项即可只统计符合条件的总行数,而不会打印出行
例子三:打印上下文
除了打印被搜索到的关键字,还将其上下文打印出来,i 代表忽略大小写,n代表输出行号,C1代表输出其上和其下1行,如果输出2行则为C2
例子四:精确搜索
只精确的关键字进行搜索,而不输出其他相关字符,-w以某个关键字进行精确搜索
第一张图中没有 w,则将 mainhelloworld也输出了,而第二个图中有w选项,则只讲main进行输出。
例子五:反向查询
略,直接填一个参数 v即可
例子六:多个条件,混合查询,“或”的关系
以main和clean进行“或”查询。
二、find
用于在目录中搜索文件
1.find命令相关参数
- -exec CMD: .
- -links N : Search for files with ‘N’ links.
- -name demo : Search for files that are specified by ‘demo’.
- -perm octal : Search for the file if permission is ‘octal’.
- -print : Display the path name of the files found by using the rest of the criteria.
- -empty : Search for empty files and directories.
- -size +N/-N : Search for files of ‘N’ blocks; ‘N’ followed by ‘c’can be used to measure the size in characters; ‘+N’ means size > ‘N’ blocks and ‘-N’ means size < ‘N’ blocks.
- -user name : Search for files owned by username or ID ‘name’.
- \(expr \) : True if ‘expr’ is true; used for grouping criteria combined with OR or AND.
-
+n 是大于n , -n 是小于n , n 等于n
-
c
– bytes ,k
– kilobytes ,M
– Megabytes ,G
– Gigabytes
2.find命令相关例子
find . -name sample.txt 查找当前目录下 sample.txt文件
find . -name "*.txt" 查找当前目录下 txt 文件
find . -iname "*.txt" 查找当前目录下txt或TXT文件,忽略大小写
find . -name sample.txt -exec rm -i {} \; 查找sample文件并进行确认删除
find . -empty 查找空的文件或文件夹
find . -type d -empty
find . -type f -empty
find . -perm 664 在当前目录及底层目录中查找 664权限的文件或文件夹
find . -type f -user jack -iname "makefile" | xargs ls -alh
find . -type f -name "abcd" 在当前目录下查找abcd文件
find . -type d -name "mydir" 在当前目录下查找mydir目录
find / -name "*.php" -type f -exec chmod 755 {} \; 在根目录下找php文件并将其改为755
find /etc /home -name "config" -type f 在多个目录下查找config文件,这里是在/home和/etc下查询
find /usr /etc -iname "systemd" -o -iname "gdb" -type f
在/usr和/etc目录下查找 systemd和gdb文件
find / -size 30M 查找大小等于30M的文件
find / -size +2M 查找大小 大于2M的文件
find . -type f -size -10M 查找当前目录下大小 小于10M的文件
find . -type f -size +1M | xargs ls -alh 查找当前目录下大于1M的文件,并列出其详细信息
find . -type f -size +100M -size -200M 查找当前目录下文件大小,大于100M,小于200M的文件
find . -type f -ctime -3 // 在当前目录下查找修改小于3天的文件,ctime修改的是文件的属性、权限、名称位置
find . -type f -mtime -3 // 在当前目录下查找修改小于3天的文件,mtime修改的是文件的内容
find . -type f -mmin -3 // 在当前目录下查找修改小于3分钟的文件
同理还有 cmin,atime, amin等, atime是指 access time通过cat/vim/less/more第一次访问的时间。
find . -name "*.c" -o -name "*.h" //查找当前目录下所有的 .c和.h文件
三、grep和find混合使用
例子一:查找main函数
先使用find命令,以文件名的方式查找 后缀为.c的文件,然后从这个文件列表中的各个文件依次进行搜索关键字 main,并打印相关关键字所在的行号。
# grep -n main $(find . -name "*.c")
例子二: 查找main函数
先使用find命令搜索当前目录下面的所有文件,然后从这些文件内容中依次查找main
find . | xargs grep --color -nse '\<main\>'
例子三:统计main文件
在当前目录下,查找包含 main 关键字的文件,并输出其相关文件及行数
也就是说,我查找了当前目录下面包含main的所有文件
find ./ -type f -name "*.*" -exec grep -inH --color "main" {} \;
注意:一定在{}和\之间要有空格,否则将会报错。
例子四:统计行数
统计当前目录下, 以.c和.h结尾的文件的行数
find . -name "*.c" -o -name "*.h" | xargs cat | wc -l