我们经常需要查找文件、统计信息,这就需要用到find、grep、wc等命令。
grep命令
grep是linux下常用的文本查找工具之一(其他还有awk、sed等);其是支持正则表达式的多用途文本搜索工具,常与其他命令组合使用(通过管道|)。
grep [选项] [匹配模式/查询内容] [文件...]
选项 | 意义 |
-c |
只输出匹配行的数量 |
-i | 搜索时忽略大小写 |
-F | 不支持正则表达式,按字符串字面意思搜索 |
-h | 查询多文件时不显示文件名 |
-l | 只列出符合匹配的文件名,而不列出具体的匹配行 |
-n | 列出所有匹配行,并显示行号 |
-s | 不显示不存在或无匹配文本的错误信息 |
-v | 显示不包含匹配文本的所有行 |
-w | 匹配整词 |
-x | 匹配整行 |
-r | 递归搜索当前及子目录 |
-q | 禁止输出任何结果,以退出状态表示搜索是否成功 |
-b | 打印匹配行距文件头部的偏移量,以自己为单位 |
-o | 与-b结合使用,打印匹配词距头部文件的偏移量 |
-E | 支持扩展正则表达式 |
pattern正则表达式主要参数:
-
\: 忽略正则表达式中特殊字符的原有含义。
-
^:匹配正则表达式的开始行。
-
$: 匹配正则表达式的结束行。
-
\<:从匹配正则表达式的行开始。
-
\>:到匹配正则表达式的行结束。
-
[ ]:单个字符,如[A]即A符合要求 。
-
[ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。
-
.:所有的单个字符。
-
* :有字符,长度可以为0。
简单示例
$ grep ‘test’ *.txt
显示所有txt文件中包含 test的行。
$ grep ‘test’ aa bb cc
显示在aa,bb,cc文件中包含 test的行。
$ grep ‘[a-z]\{5\}’ aa 或 grep -E ‘[a-z]{5}’ aa
显示所有包含每个字符串至少有5个连续小写字符的字符串的行。
$ grep ‘w\(es\)t.*\1′ aa
如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.*),这些字符后面紧跟着 另外一个es(\1),找到就显示该行。如果用egrep或grep -E,就不用”\”号进行转义,直接写成’w(es)t.*\1′就可以了
find命令
find命令是用来在给定的目录下查找符合给定条件的文件
find [OPTIONS] [查找起始路径] [查找条件] [处理动作]
OPTIONS参数:-P、-L、-H:控制软连接的对待方式,用的不多。
查找路径:就是个目录路径,相对和绝对都可以。
查找条件:
-
-name 直接加文件名,且支持文件名通配符
-
-iname 类似于-name, 但是匹配文件名时不去分大小写
-
-regex 正则表达式匹配文件名
-
-type 文件属性,按文件类型查找
-
d: 目录
-
f: 普通文件
-
l: 链接文件(link)
-
s: socket文件
-
p: 管道文件(pipe)
-
b: 块设备文件
-
c: 字符设备文件
-
-
-size [+,-][b,k,M,G] 按文件的修改时间等查找
-
使用[+,-]表示[大于,小于]
-
find . -type f -size +1k -ls:显示当前目录下所有大于1k的普通文件的详细信息
-
-
时间属性{-atime/-ctime/-mtime/-amin/-cmin/-mmin} [-/+]n
-
前面字母a、c、m分别代表访问、内容修改、状态修改,后面time为日期,min为分钟(只能以这两个作为单位);
-
mtime:当文件的内容更改时,就会更新这个时间;
-
ctime:当该文件的状态(权限与属性)改变时,就会更新这个时间;
-
atime:当“该文件的内容被取用”时,就会更新这个读取时间;
-
-
不带符号表示符合该数量的,带-表示符合该数量以后的,带+表示符合该数量以前的。
-
n为数字,意义为在n天之前的一天以内被更改过的文件。0就表示今天修改过的文件;
-
+n:列出n天之前(不含n天本身)被更改过的文件;
-
-n:列出n天之内(含有n天本身)被更改过的文件;
-
-
-
-perm MODE 按文件权限查找
-
find -perm mode:表示严格匹配,即文件权限位转换成对应的十进制数字与mode一模一样;
-
find -perm -mode:表示mode中转换成二进制的1在文件权限位里面必须匹配;
-
find -perm +mode:mode只需其中的任意一个1的部分被匹配(部分符合);
-
find . -perm -644 -ls:文件权限至少包含r-xr–r–的文件
-
-
按文件所属组
-
-gid GID
-
-uid UID
-
-user USER
-
-group GROUP
-
-nouser
-
-nogroup
-
-
组合查找
-
-a: and
-
-o: or
-
-not:
-
find . -type d -o -type l -ls
-
处理动作
-
-print: 显示
-
-ls:类似ls -l的形式显示每一个文件的详细
-
-quit: 查找到一个就退出
-
-delete: 删除匹配到的行
-
-ok COMMAND {} \; 每一次操作都需要用户确认,{}表示引用找到的文件,是占位符
-
-exec COMMAND {} \; 每次操作无需确认
wc命令
wc统计文件里面有多少单词、多少行、多少字符。
wc [-lwm]选项与参数:
-
-c 统计字节数。
-
-l 统计行数。
-
-m 统计字符数。这个标志不能与 -c 标志一起使用。
-
-w 统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串。
-
-L 打印最长行的长度。
这些选项可以组合使用。 输出列的顺序和数目不受选项的顺序和数目的影响。总是按下述顺序显示并且每项最多一列。
行数、字数、字节数、文件名
例子:
ls -l | wc -l #当前目录下的文件数
ps -ef | grep procName | wc -l # 进程数量
wc -l `find -name *.c` # .c文件数量
wc -l /etc/passwd #统计行数
find -exec详解
find命令,配合-exec参数,可以对查询的文件进行进一步的操作,可以得到很多有用的功能
-exec COMMAND {} \;
-
参数后面跟的是command命令,它的终止是以;为结束标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面加反斜杠。
-
{} 花括号代表前面find查找出来的文件名。
实例1:ls -l命令放在find命令的-exec选项中
[root@localhost test]# find . -type f -exec ls -l {} \;
-rw-r--r-- 1 root root 127 10-28 16:51 ./log2014.log
-rw-r--r-- 1 root root 25 10-28 17:02 ./log.log
-rw-r--r-- 1 root root 0 10-28 14:47 ./test3/log3-1.log
实例2:在目录中查找更改时间在n日以前的log文件并删除它们,在删除之前先给出提示
[root@localhost test]# find . -name "*.log" -mtime +5 -ok rm {} \;
< rm ... ./log_link.log > ? y
< rm ... ./log2012.log > ? n
实例3:-exec中使用grep命令
[root@localhost test]# find /etc -name "passwd*" -exec grep "root" {} \;
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
说明:
find命令首先匹配所有文件名为“ passwd*”的文件,例如passwd、passwd.old、passwd.bak,然后执行grep命令看看在这些文件中是否存在一个root用户。
实例4:查找文件移动到指定目录(父目录)
[root@localhost test3]# find . -name "*.log" -exec mv {} .. \;