美文网首页
find & grep 命令

find & grep 命令

作者: 我阿郑 | 来源:发表于2022-01-27 18:07 被阅读0次

今天学习一下Linux命令行中查找的一些常用方法
find 和 grep命令是Linux内置的命令,不需要通过额外的方式来进行安装,在任何一台Linux系统的机器上都可以直接使用find 和 grep命令

  • find命令的功能是: 查找文件;甚至可以在找到文件之后做一些后续操作
  • grep命令的功能是: 查找内容;grep命令既可以独立使用,也可以搭配find一起使用,从而达到从结果中过滤出我们需要扽内容的目的

一、find 命令

find命令的功能是: 查找文件

# 查看find的详细用法
man find 

格式:find  path -option expressions
格式:find  <路径> <选项> [表达式]
格式:find path -option [-print -exec -ok command] {} \;
  • path 表示所要查找的目录路径, 例如”.”表示当前目录,”/”表示根目录
  • -option 选项,可理解为查找规则
  • path 和 -option 部分是必须要有的
  • [ ] 方括号部分是可选的,可理解为查找完后的后续操作,有需要就写,不需要就不写
  • -print 将find找到的文件输出到标准输出
  • -exec:对找到的文件执行exec这个参数所指定的shell命令,相应的形式为:-exec command {} \;将查到的文件进行command操作,”{}”就代替查到的文件
    • ”{}”和”\”之间有一个空格
    • -ok 和-exec的作用相同,只不过-ok更加安全一点,在执行每一个命令之前,系统会让用户确定是否执行
常用可选项 (-option):
-name  根据文件名查找,支持通配符(*,?)
-iname 根据文件名查找,会忽略大小写
-type 根据文件类型查找(f-普通文件,c-字符设备文件,b-块设备文件,l-链接文件,d-目录)
-perm 根据文件的额权限查找,比如 755
-user 根据文件拥有者查找
-group 根据文件所属组查找文件
-size 根据文件大小查找文件
-empty 空的文件
-o ,-or 表达式 或
-a,-and 表达式 与
-not 表达式 非
举例说明:
# 按名字找文件
find . -name "xxx" # 在当前目录查找名字为xxx的文件或目录
find . -name "XXX" # 不区分大小写
find ./ -name "test*" # 在根目录下查找名字中包含test的文件和目录, “*”:通配任意的字符,可以是任何东西
find ./ -name "test?" # ”?”:可表示任意单个字符
find ./ -name "test[123]" # ”[]”表示通配括号里面的任意一个字符,注意[]里面的内容会被解析成单个字符, 123被解析成单字符1,2,3,所以test[123]可表示成test1,test2,test3

find /root/test/ -name "*.txt" # 查找后缀为txt的文件
find /root/test/ -name "*linux*" # 名字包含linux的文件或目录
find . \( -name "*.txt" -o -name "*.jpg" \) # 查找文件名后缀是txt或jpg的文件,注意 \( 后面的空格和 "*.jpg" 后面的空格必须有
find . -name "*.txt" -o -name "*.jpg" # 和上面写法等价
find . -name "*.txt" -or -name "*.jpg" # 和上面写法等价
find . -type f -name "*.jpg"  -delete # 查找后缀是jpg的文件,然后删除

# 使用正则的方式去查找文件名后缀是txt或jpg的文件
find . -regex ".*\(\.txt\|\.jpg\)$" 

# 根据文件类型查找
find ./ -type d -name "xxx" # 在根目录下查找名字为 xxx的目录
find ./  -type f -name "test*"  # 在根目录下查找名字中包含test的文件

# 根据修改时间查找
find . -mtime -1 #  在当前目录下查找从昨天到今天改了哪些文件和目录
find .  -type f -mtime -1 #  在当前目录下查找从昨天到今天改了哪些文件

假如在当前目录下有一个名字为jiajung的空目录,我们使用git时都知道,git上传的时候这个空目录是不会被上传的,那么这个时候我们就需要在这个空目录中加一个.gitkeep这个文件,我们可以这么做:

# 在jiajung文件夹下执行 touch .gitkeep
# touch {}/.gitkeep 表示在查找到的jiajung文件夹下面创建一个.gitkeep文件
find . -type d -empty -name "jiajung" -exec touch {}/.gitkeep \;

更多find命令的用法可以参考看这篇文章

二、grep命令

Linux grep 命令用于查找文件里符合条件的字符串

grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。

语法

grep [-abcEFGhHilLnqrsvVwxy][-A<显示行数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...]

参数:

第一格表头 第二格表头
-a 或 --text 不要忽略二进制的数据
-A<显示行数> 或 --after-context=<显示行数> 除了显示符合范本样式的那一列之外,并显示该行之后的内容
-b 或 --byte-offset 在显示符合样式的那一行之前,标示出该行第一个字符的编号
-B<显示行数> 或 --before-context=<显示行数> 除了显示符合样式的那一行之外,并显示该行之前的内容
-c 或 --count 计算符合样式的列数
-C<显示行数> 或 --context=<显示行数>或-<显示行数> 除了显示符合样式的那一行之外,并显示该行之前后的内容
-d <动作> 或 --directories=<动作> 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
-e<范本样式> 或 --regexp=<范本样式> 指定字符串做为查找文件内容的样式
E 或 --extended-regexp 将样式为延伸的正则表达式来使用
-f<规则文件> 或 --file=<规则文件> 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
-F 或 --fixed-regexp 将样式视为固定字符串的列表
-G 或 --basic-regexp 将样式视为普通的表示法来使用
-h 或 --no-filename 在显示符合样式的那一行之前,不标示该行所属的文件名称
-H 或 --with-filename 在显示符合样式的那一行之前,表示该行所属的文件名称
-i 或 --ignore-case 忽略字符大小写的差别
-l 或 --file-with-matches 列出文件内容符合指定的样式的文件名称
-L 或 --files-without-match 列出文件内容不符合指定的样式的文件名称
-n 或 --line-number 在显示符合样式的那一行之前,标示出该行的列数编号
-o 或 --only-matching 只显示匹配PATTERN 部分
-q 或 --quiet或--silent 不显示任何信息
-r 或 --recursive 此参数的效果和指定"-d recurse"参数相同
-s 或 --no-messages 不显示错误信息
-v 或 --invert-match 显示不包含匹配文本的所有行。
-V 或 --version 显示版本信息
-w 或 --word-regexp 只显示全字符合的列
-x --line-regexp 只显示全列符合的列
-y 此参数的效果和指定"-i"参数相同

实例

1、在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行。此时,可以使用如下命令:

$ grep test test* #查找前缀有“test”的文件包含“test”字符串的文件  

# 结果如下所示:
testfile1:This a Linux testfile! #列出testfile1 文件中包含test字符的行  
testfile_2:This is a linux testfile! #列出testfile_2 文件中包含test字符的行  
testfile_2:Linux test #列出testfile_2 文件中包含test字符的行 

2、以递归的方式查找符合条件的文件。例如,查找指定目录/etc/acpi 及其子目录(如果存在子目录的话)下所有文件中包含字符串"update"的文件,并打印出该字符串所在行的内容,使用的命令为:

$ grep -r update /etc/acpi #以递归的方式查找“etc/acpi” 下包含“update”的文件 
 
 # 结果如下所示:
/etc/acpi/ac.d/85-anacron.sh:# (Things like the slocate updatedb cause a lot of IO.)  
Rather than  
/etc/acpi/resume.d/85-anacron.sh:# (Things like the slocate updatedb cause a lot of  
IO.) Rather than  
/etc/acpi/events/thinkpad-cmos:action=/usr/sbin/thinkpad-keys--update 

3、反向查找。前面各个例子是查找并打印出符合条件的行,通过"-v"参数可以打印出不符合条件行的内容。

查找文件名中包含 test 的文件中不包含test 的行,此时,使用的命令为:

$ grep -v test* #查找文件名中包含test 的文件中不包含test 的行 

# 结果如下所示: 
testfile1:helLinux!  
testfile1:Linis a free Unix-type operating system.  
testfile1:Lin  
testfile_1:HELLO LINUX!  
testfile_1:LINUX IS A FREE UNIX-TYPE OPTERATING SYSTEM.  
testfile_1:THIS IS A LINUX TESTFILE!  
testfile_2:HELLO LINUX!  
testfile_2:Linux is a free unix-type opterating system.  

相关文章

网友评论

      本文标题:find & grep 命令

      本文链接:https://www.haomeiwen.com/subject/jgeahrtx.html