目录

           grep命令

Find命令

find与grep结合


grep 和 find的命令,网上可以一搜一大把,我这边仅仅记录一下我在工作学习中最最常用的命令。

grep命令

# 在 FionaTest.txt文件中找出包含test的内容。

grep  test  FionaTest.txt

如果想忽略大小写,可以用-i参数:

grep  -i  test  FionaTest.txt

如果想搜索目录里所有文件,包括子目录的话,并且在结果中显示行号,可以用以下命令:

grep -nr test *

# 当前目录中,查找后缀有 passwd 字样的文件中包含 test 字符串的文件,并打印出该字符串的行

grep test *passwd

# 以递归的方式查找符合条件的文件。例如,查找指定目录/etc/及其子目录(如果存在子目录的话)下所有文件中包含字符串"key"的文件

grep -r key /etc/

# 反向查找,通过"-v"参数可以打印出不符合条件行的内容。查找文件名中包含 test 的文件中不包含test 的行

grep -v test *test*

# 查询含有特定文本的文件,并拿到这些文本所在的行

grep -n 'passord' *.log

# 查找匹配的总行数

grep -c "被查找的字符串" 文件名

# 从文件内容查找与正则表达式匹配的行

grep –e "正则表达式" 文件名

# 查找时不区分大小写

grep –i "被查找的字符串" 文件名

# 从文件内容查找不匹配指定字符串的行

grep –v "被查找的字符串" 文件名

grep的语法支持正则表达式,正则表达式有些复杂,以后再讲解。下面是一些有用的参数:

-A num, --after-context=num: 在结果中同时输出匹配行之后的num行

-B num, --before-context=num: 在结果中同时输出匹配行之前的num行,有时候我们需要显示几行上下文。

-i, --ignore-case: 忽略大小写

-n, --line-number: 显示行号

-R, -r, --recursive: 递归搜索子目录

-v, --invert-match: 输出没有匹配的行

我们可以通过管道操作来让grep变得更强大,管道操作就是把前面一条命令的输出作为后面一条命令的输入,从而把很多简单的命令组合起来完成复杂的功能。例如,如果我们想查找包含test的行,但又想过滤掉pinetest,可以用下面的命令:

grep test FionaTest.txt | grep -v pinetest

如果我们想把搜索结果保存起来,那么可以把命令的标准输出重定向到文件:

grep test FionaTest.txt | grep -v pinetest > tests.txt

重定向符号>和管道操作符号|的区别是,重定向后面接的是一个文件,它后面不能再接任何文件或命令了;而管道操作后面接的是命令,可以无限地接下去。如果想以追加方式写到文件,可以用>>。管道操作是Linux命令行的一种哲学,它是计算机技术中少有的能沿用几十年的技术之一。通过管道操作,一行命令可以完成Windows下上千行程序也不能完成的文本处理功能。

Find命令

# 查找当前目录及其子目录下所有文件和文件夹

find . 

# 在/FionaFolder目录下查找以.txt结尾的文件名                              

find /tmp/FionaFolder -name "*.txt"   

# 组合查找文件名以passwd1开头(与、或、非)passwd2开头的文件

find . -name "passwd1*" -a -name "passwd2*"      # 与and

find . -name "passwd1*" -o -name "passwd2*"      # 或or

find . -name "passwd1*" -not -name "passwd2*"    # 非not

find . -name "passwd1*" ! -name "passwd2*"       # 非not

# 根据文件类型进行搜索

find . -type f     # f为普通文件,d为目录,l为链接

# 基于目录深度进行搜索

find . -maxdepth 2 -type f   # 最大深度为2的文件

# 基于文件权限进行搜索

find . -type f -name "*.txt" ! -perm 777    # 权限为777的以.txt结尾的文件

# 借助-exec命令,将当前目录及子目录下所有.txt格式的文件以passwd:文件名的形式打印出来

find . -type f -name "*.txt" -exec printf "passwd: %s\n" {} \;

# 借助-exec命令,将当前目录及子目录下所有 3 天前的.txt格式的文件复制一份到old目录

find . -type f -mtime +3 -name "*.txt" -exec cp {} old \;

find与grep结合

# 从根目录开始查找所有扩展名为 .msg的文本文件,并找出包含 "key" 的行

find / -type f -name "*.msg" | xargs grep "key"

# 从当前目录开始查找所有扩展名为 .log 的文本文件,并找出包含 "password" 的行

find . -name "*.log" | xargs grep "password"