一.find命令用于:在一个目录(及子目录)中搜索文件,你可以指定一些匹配条件,如按文件名、文件类型、用户甚至是时间戳查找文件。
find命令的常用形式为:find [path...] [expression]
path:指定要查找的路径
expression:可以分为“-options [-print -exec -ok ...]”
-print:把匹配的文件输出
-type:查找指定类型文件,后面常用选项有:
b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。
-exec:对匹配到的文件执行exec后面的shell命令,相应命令的形式为'command' { } \; 。注意:{ } 和\;之间的空格
实例:删除当前目录下所有以exe结尾的文件:
lc@lc-Lenovo:~/work/test$ ls
bss.exe data.exe main.c
lc@lc-Lenovo:~/work/test$ find ./ -name "*.exe" -exec rm {} \;
lc@lc-Lenovo:~/work/test$ ls
main.c
lc@lc-Lenovo:~/work/test$
lc@lc-Lenovo:~/work/test$ ls
dir1 dir2 main.c
lc@lc-Lenovo:~/work/test$ find ./ -type d -print
./
./dir2
./dir1
lc@lc-Lenovo:~/work/test$ find -name "dir*" -type d -print
./dir2
./dir1
-name:按照文件名查找
-mtime:按照时间查找
-ok,和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
实例:查找删除当前目录下以.txt结尾的更改时间在一天以内的文件
lc@lc-Lenovo:~/work/test$ ls
dir1 dir2 main.c test1.txt test2.txt
lc@lc-Lenovo:~/work/test$ find -name "*.txt" -mtime -1 -ok rm {} \;
< rm ... ./test1.txt > ? y
< rm ... ./test2.txt > ? y
lc@lc-Lenovo:~/work/test$ ls
dir1 dir2 main.c
lc@lc-Lenovo:~/work/test$
-size:按照文件大小查找
实例:查找删除当前目录下空文件
lc@lc-Lenovo:~/work/test$ ls -ll
总用量 12
drwxrwxr-x 2 lc lc 4096 8月 16 10:48 dir1
drwxrwxr-x 2 lc lc 4096 8月 16 10:48 dir2
-rw-rw-r-- 1 lc lc 0 8月 16 11:01 file1
-rw-rw-r-- 1 lc lc 0 8月 16 11:06 file2
-rw-rw-r-- 1 lc lc 124 8月 16 09:08 main.c
lc@lc-Lenovo:~/work/test$ find ./ -size 0 -exec rm {} \;
lc@lc-Lenovo:~/work/test$ ls
dir1 dir2 main.c
lc@lc-Lenovo:~/work/test$
xagrs:
使用-exec处理查找到的文件的时候,把所有匹配文件一起传递给-exec有些系统对传递给exec的参数长度有限制这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件,这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。
在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。
实例:查看当前目录下普通文件格式
lc@lc-Lenovo:~/work/test$ ls
dir1 dir2 main.c
lc@lc-Lenovo:~/work/test$ find . -type f -print |xargs file
./main.c: C source, ASCII text
./dir1/main.c: empty
lc@lc-Lenovo:~/work/test$
二.grep命令:全面搜索正则表达式并输出结果。
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
grep命令用于搜索由Pattern参数指定的模式,并将每个匹配的行写入标准输出中。这些模式是具有限定的正则表达式,它们使用ed或egrep命令样式。如果在File参数中指定了多个名称,grep命令将显示包含匹配行的文件的名称。对
shell 有特殊含义的字符 ($, *, [, |, ^, (, ), \ ) 出现在 Pattern参数中时必须带双引号。如果 Pattern参数不是简单字符串,通常必须用单引号将整个模式括起来。在诸如 [a-z], 之类的表达式中,-(减号)cml 可根据当前正在整理的序列来指定一个范围。整理序列可以定义等价的类以供在字符范围中使用。如果未指定任何文件,grep会假定为标准输入。
^ 锚定行的开始 如:'^grep'匹配所有以grep开头的行。
$ 锚定行的结束 如:'grep$'匹配所有以grep结尾的行。
. 匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。
* 匹配零个或多个先前字符 如:' *grep'匹配所有一个或多个空格后紧跟grep的行。 .*一起用代表任意字符。
[] 匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。
[^] 匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-F和H-Z的一个字母开头,紧跟rep的行。
\(..\) 标记匹配字符,如:'\(love\)',love被标记为1。
\< 锚定单词的开始,如:'\<grep'匹配包含以grep开头的单词的行。
\> 锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。
x\{m\} 连续重复字符x,m次,如:'o\{5\}'匹配包含连续5个o的行。
x\{m,\} 连续重复字符x,至少m次,如:'o\{5,\}'匹配至少连续有5个o的行。
x\{m,n\} 连续重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配连续5--10个o的行。
\w 匹配一个文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。
\W w的反置形式,匹配一个非单词字符,如点号句号等。\W*则可匹配多个。
\b 单词锁定符,如: '\bgrep\b'只匹配grep,即只能是grep这个单词,两边均为空格。
常用选项:
-?
同时显示匹配行上下的?行,如:grep -2 pattern filename同时显示匹配行的上下2行。
-b,--byte-offset
打印匹配行前面打印该行所在的块号码。
-c,--count
只打印匹配的行数,不显示匹配的内容。
-f File,--file=File
从文件中提取模板。空文件中包含0个模板,所以什么都不匹配。
-h,--no-filename
当搜索多个文件时,不显示匹配文件名前缀。
-i,--ignore-case
忽略大小写差别。
-q,--quiet
取消显示,只返回退出状态。0则表示找到了匹配的行。
-l,--files-with-matches
打印匹配模板的文件清单。
-L,--files-without-match
打印不匹配模板的文件清单。
-n,--line-number
在匹配的行前面打印行号。
-s,--silent
不显示关于不存在或者无法读取文件的错误信息。
-v,--revert-match
反检索,只显示不匹配的行。
-w,--word-regexp
如果被\<和\>引用,就把表达式做为一个单词搜索。
-V,--version
显示软件版本信息。
实例:
1.在main.c文件查找main字符串
lc@lc-Lenovo:~/work/test$ cat main.c
#include <stdio.h>
#include <stdlib.h>
int data_array[1024*1024] = {1};
//define main
int main(int argc, char* argv[])
{
return (0);
}
lc@lc-Lenovo:~/work/test$ grep 'main' main.c
//define main
int main(int argc, char* argv[])
lc@lc-Lenovo:~/work/test$
2.在main.c文件中查找以int开头的行并打印行号
lc@lc-Lenovo:~/work/test$ cat main.c
#include <stdio.h>
#include <stdlib.h>
int data_array[1024*1024] = {1};
//define main
int main(int argc, char* argv[])
{
return (0);
}
lc@lc-Lenovo:~/work/test$ grep -n '\<int' main.c
5:int data_array[1024*1024] = {1};
7:int main(int argc, char* argv[])
lc@lc-Lenovo:~/work/test$
3.在main.c查找出现指定频率字符的行打印行号
lc@lc-Lenovo:~/work/test$ cat main.c
#include <stdio.h>
#include <stdlib.h>
aaaaaaaaa
aaaa
aaaaa
dddddddd
ddddd
dddd
int data_array[1024*1024] = {1};
//define main
int main(int argc, char* argv[])
{
return (0);
}
lc@lc-Lenovo:~/work/test$ grep -n '[a-c]\{5\}' main.c
5:aaaaaaaaa
7:aaaaa
lc@lc-Lenovo:~/work/test$ grep -n '[a-c]\{4,\}' main.c
5:aaaaaaaaa
6:aaaa
7:aaaaa
lc@lc-Lenovo:~/work/test$
~~~~~~~~~the end______________