您的位置:首页 > 运维架构 > Linux

Linux 文件搜索命令find,grep

2017-04-07 09:49 651 查看


find 命令

简单示例:
find . -type f -name "test"

-type f
 普通文件

-type d
 目录
-type p
 管道
-type l
 符号链接
-name "文件名"
 要搜索的文件名

还可以用 
-iname
 进行大小写无关的搜索

搜索文件的结果作为下一个命令的参数

使用
-exec
参数,示例:

find . -type f -iname "*test*" -exec ls -l \{\} \;


*
\{\}
 是输入参数的占位符,哪里需要放哪里。这里的转义符在我的机器上可有可无 
{}
 也可以
\;
 表示命令的结束*

加上文件大小限制 
-size

find . -type f -name "*.c" -size +100k
 搜索当前目录下大于100KB的.C 文件

find . -type f -name "*.c" -size -1000c
 搜索当前目录下小于1000字节的.C文件
find . -type f -name "*.c" -size 1000c
 搜索当前目录下等于1000字节的.C文件

搜索 -1k 无效的,应换为 1024c

支持的单位:
c
 字节 
w
 字 
k
 千字节 
M
 兆字节 
G
 1G字节 
b
 512个字节块,相当于一个扇区,单位是大小写敏感的

搜索最近修改的文件
ctime
 最近访问, 
mtime
 最近修改文件内容, 
atime
最近修改文件的节点信息

ctime
为例, 
ctime
n
表示最近n天以前访问的, 
ctime -n
表示最近n天之内访问的。
find . -type f -name "*.c" -ctime +1
 修改一天以前访问的 .C 文件

*ctime 包括了 mtime, 同时还包括了文件权限、文件所属用户等基本信息的修改

他们的区别参见 Difference between mtime, ctime and atime*

还可以使用 
cmin
 
mmin
 
amin
 将时间粒度缩小到分钟

搜索指定用户的文件
find / -user syslog
 搜索属于 syslog用户的文件。

find / -group shadow
 搜搜用户组shadow的文件
find / -perm 644
 搜索644权限的文件
find / -perm -644
 搜索包含 644权限的文件,例如744

find 命令是递归搜索目录的, 可以通过 
-maxdepth num
 指定递归的深度,该参数建议放在紧跟目录路径后的位置,不然会有一条警告。


grep 根据文件的内容进行搜索

基本示例:搜索某个文件中包含关键字: 
grep 'keyword' filename
 多个文件空格分开


常用参数说明


选择正则匹配的模式:


-E
 扩展正则模式,等价于 
egrep


-F
 字符串,不使用正则匹配 ,等价于
fgrep


-P
 perl的正则风格(PCRE)

-G
 基本正则模式
-E
-G
主要区别在于,
基本模式下 
?, +, {, |, (, )
这些元字符是失效的,作为普通字符解释。需要在基本模式中使用元字符请加转义符
\
。例如我要匹配当前目录下文本中包含
{{{

需要写成
grep -R '{\{3\}' ./*
 或者 
grep
-ER '{{3}' ./*


建议将正则部分始终放在单引号中,例如想匹配 PHP 或 apache应写成 
egrep
php \|apache
egrep 'php|apache'
否则 
|
 在Linux 命令行下会被当作一个管道符号
grep,egrep,fgrep的区别请戳我

影响匹配的其他参数


-i
 忽略大小写

-w
 单词匹配

-v
 显示不匹配的行

-f
 使用保存在文件中的正则表达式做匹配
egrep -f pattern.txt a.txt b.txt


使用pattern.txt的正则匹配,pattern.txt 内容为 
[[:digit:]]{9}
 ,匹配结果为

a.txt:123456

b.txt:234575

保存正则表达式的文件, 默认一行一个正则,搜索中会将匹配所有正则的结果输出

-x
 搜索的文件需要一整行匹配正则表达式

例如将上例中的 a.txt第一行内容
123456
 修改为 
123456
789
, 执行如下命令

egrep -xf pattern.txt a.txt b.txt
, 匹配结果为

b.txt:234575 

因为修改后a.txt的内容,不再一整行都满足正则,也可以理解为正则加了行首行尾的位置匹配: 
^expression$


影响匹配结果显示的参数


-c
 显示匹配的行数,不显示匹配的具体内容

-L
 只显示没有匹配的文件名

-l
 只显示匹配的文件名

-m num
 限制匹配的次数,最大为num个
egrep -m 1 -f pattern.txt a.txt b.txt
 这样一条指令,只会在每个文件中匹配 1 次,便开始搜索下一个文件

-o
 only matching,只显示匹配一行中匹配到的内容。
grep 默认是将能包含匹配内容所在行输出,使用
-o
则只打印匹配的部分

-n
 显示匹配行在所匹配文件中行数。

-h
 不显示匹配的结果中的文件名列


影响文件、目录搜索方式的参数


-r
 or 
-R
 递归的搜索目录,
很常用

区别在于-R 会搜索符号链接指向的文件或目录; -r 则不会,除非该符号链接在参数中显示指定了一个符号链接,例如

egrep -rn '[[:digit:]]' ./ ./.local/share/systemd/user
,该命令在当前目录下搜索,
还包括了一个符号链接

--exclude=GLOB
 跳过文件名匹配'GLOB'的文件,例如在版本库中搜索时
egrep --exclude=*.svn -rnf pattern.txt ./
 排除版本库的文件

GLOB 中可以使用 , ?, []*

--include=GLOB
 仅在文件名匹配'GLOB'的文件中搜索


示例


排除多个目录进行搜索
grep -rn --color --exclude-dir={node_modules,scripts,tests} "console.log" ./*


mac 下替换多个文件内容
grep -rl '10.0.2.118' ./*.js | xargs sed -i -e "s/abc/def/g"


mac 下替换 
\t
 为空格
find . -type f -name "*.js" -exec sed -i '' "s/$(printf '\t')/ /g" \{\} \;


linux 下查找大文件 
find /var/logs/ -type f -size +1000000k -exec ls -lh {} \;


参考

How to run grep
with multiple AND patterns?


本文转载:https://segmentfault.com/a/1190000000622746

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: