Shell常用命令find、grep总结

一、find 命令

  find 命令的常用形式可以简化为 

1 find [path...][expression]

 

  •  path:find 命令查找的目录路径,其中 ./ 表示当前目录,/ 表示系统根目录
  •  expression:可以分为

     

1 -options [-print -exec -ok ...]

 

    •  -options:指定 find 命令的常用选项
    •  -print:find 命令将匹配的文件输出到标准输出
    •  -exec:find 命名对匹配的文件执行该参数所给出的 shell 命令
    •  -ok:与 -exec 类似,只不过在执行每一个命令之前都会给出提示,让用户决定是否执行    

1. find 命令的常用选项

  •  -name

  按照文件名查找文件。

1 # 在当前目录与子目录下查找txt后缀的文件
2 find ./ -name "*.txt"

 

  •  -mtime -n +n  

  按照文件的更改时间来查找文件,-n 表示文件更改时间在 n 天之内,+n 表示文件更改时间在 n 天之外。

1 # 查找在当前目录下2天内修改的文件
2 find ./ -mtime -2
  •  -newer file1

  查找比文件 file1 新(即更改时间晚)的文件

1 # 查找当前目录下比1.txt新的文件
2 find ./ -newer 1.txt
  • -type

  查找某一类型的文件,例如

    d - 目录

    f - 普通文件

    b - 块设备文件

    c - 字符设备文件

    p - 管道文件

    l - 符号链接文件

1 # 在当前目录查找所以目录文件
2 find ./ -type d
  • -size n

  查找大小为 n 的文件,末尾带有 c 时表示文件大小以字节计,带 k 时表示文件大小以 KB 计,以此类推。

1 # 查找当前目录下大小大于10k的文件
2 find ./ -size +10000c

 

 

2. find 与 xargs 搭配

  xargs 与 -exec 类似,对 find 命名匹配的文件执行该参数所给出的 shell 命令,并且效率更高。

 1 # 查找当前目录下所有文件并输出文件类型
 2 find . -type f -print | xargs file 
 3 
 4 # 查找当前目录下所有txt文件并将结果输出到txt.log文件,一行输出一个结果
 5 find . -name "*.txt" -print | xargs -n1 > /e/txt.log
 6 
 7 # 查找当前目录下的所有文件并在这些文件中搜索add_experience并将结果输出到文件
 8 find . -type f | xargs grep "add_experience" > /f/add_experience.txt
 9 
10 # 删除3天以前的所有文件和文件夹
11 find ./ -mtime +3 -print | xargs rm -f -r
12 
13 # 删除文件大小为0的文件
14 find ./ -size 0 | xargs rm -f

 

 

二、grep 命令

 

  grep 是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。它的命令格式一般为:

1 grep [option] "pattern" filename
  • option 常见选项
    •  -c:只输出匹配行的计数
    •  -i:不区分大小写(只适用与单字符)
    •  -n:显示匹配行及行号
    •  -s:不显示不存在或无匹配文本的错误信息
    •  -v:显示不包含匹配文本的所有行
    •  -o:只显示文件中匹配到的部分
    •  -l:列出匹配的文件清单
    •  -L:列出不匹配的文件清单
  •  pattern:要搜索的关键字或正则表达式语句
  •  要搜索的文件名

1.简单使用

  如下所示:

1 # 查找1.txt中存在aaa的行,并输出行号
2 grep -n "aaa" 1.txt

 

 

2. 正则表达式

  正则表达式主要元字符及使用如下表所示:

元字符

功能

例子

匹配什么

^

锚定行的开始

/^love/

匹配所有以love开头的行

$

锚定行的结束

/love$/

匹配所有以love 结束的行

.

匹配一个字符

/l..e/

匹配这样的行,这些行包含这样的字符:第一个字符是l,紧跟着两个字符,然后是e

*

代表0个或多个先前字符

/*love/

匹配所有这样的行,有0个或多个空格,空格后跟着love

[]

匹配字符组中的一个字符

/[Ll]ove/

匹配所有包含love或者Love的行

[^]

匹配一个不在范围内的字符

/[^A-Z]ove/

 

<

锚定单词的开始

<love

匹配所有这样的行,这些行包含以love开头的单词(vi和grep支持这个功能)

>

锚定单词的结束

Love>

匹配所有这样的行,这些行包含以love结束的单词(vi和grep支持这个功能)

(..)

标记后面用到的匹配字符

/(love)able1rs/

最多可以使用9个标签。第一个标签是模板最左边的部分。在本例子中,模板love保存的标签为1,后面的1指得就是love;本例子搜索的是这样的行,这些行包含这样的字符,在Loveabel后面跟着lovers

x{m}

M次复制字符x

   

x{m,}

至少m次复制字符x

   

x{m,n}

至少m次,至多n次复制字x

   

w

文字和数字字符,[A-Za-z0-9]

Lw*e

匹配一个L字符,紧跟着0个或多个文字或数字字符,然后是e

W

同上

   

b

单词分界线

bloveb

仅仅匹配单词love

 

  简单使用如下:

1 # 搜索aaa开头的行
2 grep -n '^aaa' 1.txt
3 
4 # 搜索至少包含连续3个a的行
5 grep -n 'a\{3,\}' 1.txt
6 
7 # 搜索包含aaa或者daa的行
8 grep -n '[ad]aa' 1.txt

 

posted @ 2018-07-04 17:04  Just_for_Myself  阅读(2560)  评论(0编辑  收藏