今天学习一下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 \;
二、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.
网友评论