find--在某个指定的路径下查找需要的文件或目录
格式:
find [查找位置] [查找标准] [处理动作]
查找位置:默认为当前目录,可以指定多个目录,多个之间用空格
查找标准:默认为查找指定目录下的所有文件
处理动作:显示到标准输出,默认为print
查找标准
以文件名查找
-name "文件名称" : 根据文件名查找,支持glob(文件名通配),注意文件名需用双引号
1
2
3
4
5
6
7
<code>[root@localhost ~]</code><code># find /etc/ -name "ifcfg-eth0"</code>
<code>/etc/sysconfig/network-scripts/ifcfg-eth0</code>
<code>[root@localhost ~]</code><code># find /etc/ -name "ifcfg*"</code>
<code>/etc/sysconfig/network-scripts/ifcfg-lo</code>
<code>/etc/sysconfig/network-scripts/ifcfg-eth0bak</code>
<code>[root@localhost ~]</code><code>#</code>
-iname "文件名称",根据文件名查找,不区分大小写
<code>[root@localhost ~]</code><code># mkdir Justin juStin jusTin</code>
<code>[root@localhost ~]</code><code># find -iname "justin"</code>
<code>.</code><code>/juStin</code>
<code>.</code><code>/jusTin</code>
<code>.</code><code>/Justin</code>
以文件的属性查找
-user "USERNAME" ----根据属主查找
-group "GROUP" --- 根据属组查找
-uid "UID" ---根据UID查找
-gid "GID" ---根据GID查找
-nouser--- 查找没有属主的文件
-nogroup--- 查找没有属组的文件
<code>#在/dev目录下查找用户名为root组为disk的文件并用长格式显示</code>
<code>[root@localhost ~]</code><code># find /dev/ -user root -a -group disk -ls</code>
<code> </code><code>10630 0 crw-rw---- 1 root disk 9月 24 10:18 </code><code>/dev/sg0</code>
<code> </code><code>10241 0 brw-rw---- 1 root disk 9月 24 10:18 </code><code>/dev/ram3</code>
<code> </code><code>9915 0 brw-rw---- 1 root disk 9月 24 2013 </code><code>/dev/ram1</code>
多条件查找连接符
-a: 与
-o: 或
-not、!:非
<code>[root@localhost home]</code><code># ls</code>
<code>111.txt 222.log justin justin1 justin2</code>
<code>[root@localhost home]</code><code># find /home/ -name "*.txt" -o -name "*.log"</code>
<code>/home/222</code><code>.log</code>
<code>/home/111</code><code>.txt</code>
<code>[root@localhost home]</code><code># find /home/ -name "*.txt" -a -name "*.log"</code>
以文件类型查找
-type 文件类型
文件类型指的是普通文件(f)、目录(d)、块设备文件(b)、字符设备文件(c)、符号链接文件(l)、命令管道文件(p)、套接字文件(s)等
<code>[root@localhost ~]</code><code># find /bin/ -type l</code>
<code>/bin/mail</code>
<code>/bin/rview</code>
<code>/bin/ex</code>
<code>/bin/gtar</code>
以文件大小查找
-size”大小条件
一般使用“+”、“-”号设置超过或小于指定的大小作为查找条件。常用的容量单位包括k(注意是小写)、M、G。
8
9
10
11
12
13
<code>[root@localhost ~]</code><code># find /root/ -size 2k ;大小为2K的文件</code>
<code>/root/</code><code>.gconf</code><code>/apps/brasero/config/priority/</code><code>%gconf.xml</code>
<code>/root/</code><code>.gconf</code><code>/desktop/gnome/accessibility/keyboard/</code><code>%gconf.xml</code>
<code>/root/</code><code>.gnote</code><code>/89099c13-c354-48d6-89ce-0415b1db3c78</code><code>.note</code>
<code>/root/</code><code>.gnote</code><code>/db520e7c-3433-4433-b35a-3ad9a14e16d4</code><code>.note</code>
<code>/root/anaconda-ks</code><code>.cfg</code>
<code>[root@localhost ~]</code><code># find /root/ -size +50k ;大小超过50k的文件</code>
<code>/root/</code><code>.cache</code><code>/ibus/pinyin/user-1</code><code>.3.db</code>
<code>/root/</code><code>.cache</code><code>/ibus/bus/registry</code><code>.xml</code>
<code>/root/</code><code>.pulse</code><code>/8665cfcff9c76f94fac16e0000000022-device-volumes</code><code>.tdb</code>
<code>/root/</code><code>.gstreamer-0.10</code><code>/registry</code><code>.i386.bin</code>
<code>/root/</code><code>.gconfd</code><code>/saved_state</code>
-empty 空文件(目录)
<code>[root@localhost ~]</code><code># find -empty /</code>
-maxdepth 限制find命令在目录中按照递减方式查找文件的时候搜索文件超过某个级别或者搜索过多的目录
<code>[root@localhost ~]</code><code># find . -maxdepth 2 -name fred</code>
假如这个fred文件在./sub1/fred目录中,那么这个命令就会直接定位这个文件,查找很容易成功。假如,这个文件在./sub1/sub2/fred目录中,那么这个命令就无法查找到。因为前面已经给find命令在目录中最大的查询目录级别为2,只能查找2层目录下的文件。这样做的目的就是为了让find命令更加精确的定位文件,如果你已经知道了某个文件大概所在的文件目录级数,那么加入-maxdepth n 就很快的能在指定目录中查找成功。
以文件修改时间查找
-atime [+|-]# : access time访问时间,默认为天,#表示#天的这个时间点,+#表示至少有#天没访问, -#表示#天之内有访问
-mtime [+|-]# : modify time修改时间,#表示#天的这个时间点没有被修改,+#表示至少有#天没有修改 , -#表示#天之内有修改
-ctime [+|-]# : change time改变时间,#表示#天的这个时间点没有被改变,+#表示至少有#天没有被改变 , -#表示#天之内有被改变
mtime和ctime的区别在于,只有修改了文件的内容,才会更新文件的mtime,而对文件更名,修改文件的属主等操作,只会更新ctime。举例说明: 对文件进行mv操作,mtime不变,ctime更新;编辑文件内容,mtime和ctime同时修改。
-amin [+|-]# :时间为分钟,#表示#分钟的这个时间点没有被访问,+#表示至少有#分钟没有被访问 , -#表示#分钟之内访问
-mmin [+|-]# :时间为分钟,#表示#分钟的这个时间点没有被修改,+#表示至少有#分钟没有被修改 , -#表示#分钟之内有被修改
-cmin [+|-]# :时间为分钟,#表示#分钟的这个时间点没有被改变,+#表示至少有#分钟没有被改变 , -#表示#分钟之内有被改变
<code>[root@localhost logs]</code><code># find /opt/queryweb/logs -mtime +7 -type f -name "*.log" -exec rm -f {} \;</code>
<code>[root@localhost logs]</code><code>#</code>
以文件权限查找
-perm [+|-] MODE
不带[+|-]表示精确权限匹配,
+表示任何一类用户的任何一位权限匹配
- 表示每类用户的每位权限都匹配
14
15
<code>#精确匹配/etc下权限为755的文件。ugo都必须同时满足</code>
<code>[root@localhost ~]</code><code># find /etc/ -perm 755 -ls |more</code>
<code>622593 16 drwxr-xr-x 98 root root 12288 Aug 6 14:39 </code><code>/etc/</code>
<code>622778 8 drwxr-xr-x 2 root root 4096 Jan 12 2007 </code><code>/etc/jvm</code>
<code>622638 8 drwxr-xr-x 2 root root 4096 Aug 2 16:44 </code><code>/etc/xinetd</code><code>.d</code>
<code>#755用二进制表示为111 101 101;+后跟权限匹配原则是满足所有权限位的一个位就可以</code>
<code>[root@localhost ~]</code><code># find /etc/ -perm +755 -ls |more</code>
<code>622625 8 -rw-r--r-- 1 root root 135 Aug 6 13:31 </code><code>/etc/printcap</code>
<code>622645 20 -rw-r--r-- 1 root root 14100 Sep 5 2006 </code><code>/etc/mime</code><code>.types</code>
<code>#-后跟权限匹配原则是ugo中所有位权限必须同时满足,属主必须为rwx,属组和other至少为rw</code>
<code>[root@localhost ~]</code><code># find /etc/ -perm -755 -ls |more</code>
处理动作
-print---find命令将匹配的文件输出到标准输出。
-exec---对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' {} \;,注意{}和\;之间的空格,同时两个{}之间没有空格
-ok---和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
<code># 在当前目录下查找除目录以外的所有类型的文件 ,并打印出来</code>
<code>[root@localhost </code><code>test</code><code>]</code><code># find . ! -type d –print</code>
<code>#查找root目录下的以log结尾的文件,将其复制到test目录下。</code>
<code>[root@localhost </code><code>test</code><code>]</code><code># find /root –name “*log” –type f –exec cp {} /root/test/ \; 2>/dev/null</code>
<code>#通过-exec参数指定后面要执行的命令,{}表示将查找到的内容全部复制,\;表示命令的结束,2>/dev/null是指将执行查找过程中出现的错误信息重定向到黑洞文件中,也就是不显示那些错误信息。</code>
<code>#长格式显示test下的普通文件</code>
<code>[root@localhost </code><code>test</code><code>]</code><code># find . -type f -exec ls -l { } \;</code>
<code>#***test下大小为0的文件</code>
<code>[root@localhost </code><code>test</code><code>]</code><code># find ./ -size 0 -exec rm {} \;</code>
<code>#在当前目录中查找所有文件名以.conf结尾、更改时间在5日以上的文件,并***它们,只不过在***之前先给出提示</code>
<code>[root@localhost </code><code>test</code><code>]</code><code># find . -name "*.conf" -mtime +5 -ok rm { } \;</code>
/dev/zero主要的用处是用来创建一个指定长度用于初始化的空文件,就像临时交换文件。
在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。
在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;
而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。
<code>#查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件[root@localhost ~]# find . -type f -print | xargs file</code>
<code>#在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中:</code>
<code>[root@localhost ~]</code><code># find / -name "core" -print | xargs echo "" >/tmp/core.log</code>
<code>#用grep命令在所有的普通文件中搜索hostname这个词</code>
<code>[root@localhost ~]</code><code># find . -type f -print | xargs grep "hostname"</code>
<code>#***3天以前的所有东西 (find . -ctime +3 -exec rm -rf {} \;)</code>
<code>[root@localhost ~]</code><code># find ./ -mtime +3 -print|xargs rm -f –r</code>
<code>#***文件大小为零的文件</code>
<code>[root@localhost ~]</code><code># find ./ -size 0 | xargs rm -f &</code>
xargs命令是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具。它擅长将标准输入数据转换成命令行参数,默认从管道传来的值是放在最后的
xargs能够处理管道或者stdin并将其转换成特定命令的命令参数。xargs是构建单行命令的重要组件之一。
xargs也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。xargs的默认命令是echo,空格是默认定界符。这意味着通过管道传递给xargs的输入将会包含换行和空白,不过通过xargs的处理,换行和空白将被空格取代。xargs是构建单行命令的重要组件之一。如下:
<code>[root@localhost ~]</code><code># cat xargs.txt </code>
<code>1 2 3 4</code>
<code>a b c d</code>
<code>A B C D</code>
<code>a1 b2 c3 d4</code>
<code>A1 B2 C3 D4</code>
<code>[root@localhost ~]</code><code># cat xargs.txt | xargs</code>
<code>1 2 3 4 a b c d A B C D a1 b2 c3 d4 A1 B2 C3 D4</code>
-0 当sdtin含有特殊字元时候,将其当成一般字符,像/'空格等
-a file 从文件中读入作为sdtin
<code>1 1 1 1</code>
<code>2 2</code>
<code>3 3 3 </code>
<code>4 4 4 4</code>
<code>5 5 5 5</code>
<code>[root@localhost ~]</code><code># xargs -a xargs.txt </code>
<code>1 1 1 1 2 2 3 3 3 4 4 4 4 5 5 5 5</code>
-e flag ,注意有的时候可能会是-E,flag必须是一个以空格分隔的标志,当xargs分析到含有flag这个标志的时候就停止。
<code>[root@localhost ~]</code><code># cat xargs.txt |xargs -E "3" echo</code>
<code>1 1 1 1 2 2</code>
-p 操作具有可交互性,每次执行comand都交互式提示用户选择
<code>[root@localhost ~]</code><code># cat xargs.txt |xargs -p echo</code>
<code>echo</code> <code>1 1 1 1 2 2 3 3 3 4 4 4 4 5 5 5 5 ?...y</code>
-n xargs 的-n选项设置每次送给command命令的参数个数,参数以空白字符或<newline>换行符分割
<code>[root@localhost ~]</code><code># cat xargs.txt |xargs -n 3 echo</code>
<code>1 1 1</code>
<code>1 2 2</code>
<code>3 3 3</code>
<code>4 4 4</code>
<code>4 5 5</code>
<code>5 5</code>
-t 启用命令行输出模式:其先回显要运行的命令,然后执行命令,打印出命令结果,跟踪与调试xargs的利器,也是研究xargs运行原理的好办法;
-i -i 选项告诉 xargs 可以使用{}代替传递过来的参数, 建议使用-I,其符合POSIX标准
-I 格式: xargs -I rep-str comand rep-srt rep-str 为代替传递给xargs参数, 可以使 {} $ @ 等符号 ,其主要作用是当xargs command 后有多个参数时,调整参数位置。eg:find . -name "*.txt " |xargs -I {} cp {} /tmp ;默认管道会将find的结果传递给cp做为最后的参数,通过-I来指定起传递过来参数的未知
-r 如果没有要处理的参数传递给xargsxargs 默认是带 空参数运行一次,如果你希望无参数时,停止 xargs,直接退出,使用 -r 选项即可,其可以防止xargs 后面命令带空参数运行报错。If the standard input does not contain any nonblanks, do not run the command, exit
-s size 设置每次构造Command行的长度总大小,包括 command +init-param +传递参数,Size 参数必须是正整数
-L num Use at most max-lines nonblank input lines per command line.-s是含有空格的。
-l 同-L
-d delim 分隔符,默认的xargs分隔符是回车,argument的分隔符是空格,这里修改的是xargs的分隔符
<code>[root@localhost ~]</code><code># echo "51ctox51ctox51cto"|xargs -dx</code>
<code>51cto 51cto 51cto</code>
<code>[root@localhost ~]</code><code># echo "51ctox51ctox51cto"|xargs -n1 -dx</code>
<code>51cto</code>
-x exit的意思,主要是配合-s使用。
-P 修改最大的进程数,默认是1,为0时候为as many as it can ,这个例子我没有想到,应该平时都用不到的吧。
查找并显示文件
找到某个文件是我们的目的,我们更想知道查找到的文件的详细信息和属性,如果我们采取现查找文件,在使用LS命令来查看文件信息是相当繁琐的,现在我们也可以把这两个命令结合起来使用。
<code>[root@localhost ~]</code><code># find / -name "httpd.conf" -ls </code>
<code>12063 34 -rw-r--r-- 1 root root 33545 Dec 30 15:36 </code><code>/etc/httpd/conf/httpd</code><code>.conf</code>
find命令配合使用exec和xargs可以使用户对所匹配到的文件执行几乎所有的命令。
which---查找外部命令所对应的程序文件
<code>[root@localhost ~]</code><code># which ls</code>
<code>alias</code> <code>ls</code><code>=</code><code>'ls --color=auto'</code>
<code> </code><code>/bin/ls</code>
<code>[root@localhost ~]</code><code># which pwd</code>
<code>/bin/pwd</code>
<code>[root@localhost ~]</code><code># which cd</code>
<code>/usr/bin/which</code><code>: no </code><code>cd</code> <code>in</code> <code>(</code><code>/usr/lib/qt-3</code><code>.3</code><code>/bin</code><code>:</code><code>/usr/local/sbin</code><code>:</code><code>/usr/local/bin</code><code>:</code><code>/sbin</code><code>:</code><code>/bin</code><code>:</code><code>/usr/sbin</code><code>:</code><code>/usr/bin</code><code>:</code><code>/root/bin</code><code>)</code>
说明:which命令用于查找Linux外部命令所对应的程序文件,其搜索范围由环境变量PATH决定,在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令,执行命令后,首先显示出系统中所设置命令的别名,然后是命令的程序文件如“/bin/ls”。如果要查找的是一个内部命令,那将找不到任何对应的程序文件如cd。
whereis---查找文件或目录
-b---只找二进制文档
-m---只查找manual路径下的文件
-s---只查找source下的
-u---查找以上三个找不到的文件档案
<code>[root@localhost ~]</code><code># whereis pwd</code>
<code>pwd</code><code>: </code><code>/bin/pwd</code> <code>/usr/share/man/man1/pwd</code><code>.1.gz </code><code>/usr/share/man/man1p/pwd</code><code>.1p.gz</code>
<code>[root@localhost ~]</code><code># whereis etc</code>
<code>etc: </code><code>/usr/local/etc</code>
<code>[root@localhost ~]</code><code># whereis -b pwd</code>
<code>pwd</code><code>: </code><code>/bin/pwd</code>
<code>[root@localhost ~]</code><code># whereis -m pwd</code>
<code>pwd</code><code>: </code><code>/usr/share/man/man1/pwd</code><code>.1.gz </code><code>/usr/share/man/man1p/pwd</code><code>.1p.gz</code>
<code>[root@localhost ~]</code><code># whereis -s pwd</code>
<code>pwd</code><code>:</code>
<code>[root@localhost ~]</code><code># whereis -u pwd</code>
说明:只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s),如果省略参数,则返回所有信息
locate---查找文件
<code>#查找/etc下pass开头的文件</code>
<code>[root@localhost ~]</code><code># locate /etc/pass</code>
<code>/etc/passwd</code>
<code>/etc/passwd-</code>
说明:locate命令其实是“find -name”的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库(/var/lib/locatedb),这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库
grep---Global Regular Expression Print全局搜索正则表达式并将结果打印出来---在文件中查找并显示包含指定字符串的行,目标是字符串
格式:grep [参数] 查找条件 目标文件
功能说明:grep指令是一种强大的文本搜索工具,是一个对行进行搜索的操作,它能使用正则表达式搜索文本,用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设grep指令会把含有范本样式的那一行显示出来。若不指定任何文件名称,或是所给予的文件名为“-”,则grep指令会从标准输入设备读取数据。
Unix的grep家族包括grep、egrep和fgrep。 egrep表示扩展的grep,相比grep支持更多的元字符(元字符就是指那些在正则表达式中具有特殊意义的专用字符),"grep -E"相当于egrep。fgrep是fast grep,不支持元字符,但是搜索速度更快。grep搜索的结果被送到屏幕,不影响原文件内容。
grep搜索建议:
匹配字符串、调用变量时建议使用双引号:grep "ZOO_INFO" zookeeper.log g r e p“$ M Y VA R” zookeeper.log
正则匹配应使用单引号:grep ‘\<ZOO_INFO\>’ zookeeper.log
--color=auto 匹配的关键用颜色显示出来
<a href="http://blog.51cto.com/attachment/201312/152250430.png" target="_blank"></a>
如果每次使用 grep 都得要自行加上 --color=auto 需要在 ~/.bashrc 内加上这行:『alias grep='grep --color=auto'』再以『 source ~/.bashrc 』来立即生效即可
<a href="http://blog.51cto.com/attachment/201312/152428115.png" target="_blank"></a>
<code>[root@justin ~]</code><code># source /root/.bashrc</code>
-v---反向查找,即输出与查找条件不相符的行
<a href="http://blog.51cto.com/attachment/201309/133324769.png" target="_blank"></a>
-i或--ignore-case---忽略字符大小写的差别
<code>[root@localhost home]</code><code># echo "a" > i</code>
<code>[root@localhost home]</code><code># echo "A" >> i</code>
<code>[root@localhost home]</code><code># cat i</code>
<code>a</code>
<code>A</code>
<code>[root@localhost home]</code><code># grep "a" i</code>
<code>[root@localhost home]</code><code># grep -i "a" i</code>
<code>[root@localhost home]</code><code>#</code>
-E---多个字符串一起搜寻,就是egrep
<code>[root@justin ~]</code><code># cat /etc/samba/smb.conf |egrep -v '#|;'</code>
过滤掉#号和;号的行
-A<显示行数n>或--after-context=<显示行数n> 除了显示符合范本样式的那一列之外,并显示该行之后n行的内容。
<code>[root@localhost ~]</code><code># cat /boot/grub/grub.conf | grep -A 2 title</code>
<code>title Red Hat Enterprise Linux (2.6.32-279.el6.i686)</code>
<code> </code><code>root (hd0,0)</code>
<code> </code><code>kernel </code><code>/vmlinuz-2</code><code>.6.32-279.el6.i686 ro root=UUID=31d213fb-c46d-4b1d-9300-f43c0c7afb94 rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet</code>
<code>[root@localhost ~]</code><code># cat /boot/grub/grub.conf | grep title</code>
-B<显示行数n>或--before-context=<显示行数n> 除了显示符合范本样式的那一行之外,并显示该行之前n行内容
<code>[root@localhost ~]</code><code># cat /boot/grub/grub.conf | grep -B 2 title</code>
<code>splashimage=(hd0,0)</code><code>/grub/splash</code><code>.xpm.gz</code>
<code>hiddenmenu</code>
-C<显示行数n>或--context=<显示行数n>或-<显示行数n> 除了显示符合范本样式的那一行之外,并显示该行之前后n行的内容。
<code>[root@localhost ~]</code><code># cat /boot/grub/grub.conf | grep -C 2 title</code>
-c或--count 计算符合范本样式行数。
16
17
18
19
20
21
<code>[root@localhost ~]</code><code># cat /boot/grub/grub.conf | grep -c 2.6.32</code>
<code>3</code>
<code>[root@localhost ~]</code><code># cat /boot/grub/grub.conf</code>
<code># grub.conf generated by anaconda</code>
<code>#</code>
<code># Note that you do not have to rerun grub after making changes to this file</code>
<code># NOTICE: You have a /boot partition. This means that</code>
<code># all kernel and initrd paths are relative to /boot/, eg.</code>
<code># root (hd0,0)</code>
<code># kernel /vmlinuz-version ro root=/dev/sda2</code>
<code># initrd /initrd-[generic-]version.img</code>
<code>#boot=/dev/sda</code>
<code>default=0</code>
<code>timeout=5</code>
<code> </code><code>initrd </code><code>/initramfs-2</code><code>.6.32-279.el6.i686.img</code>
-r或--recursive 递归的搜索
当要只知道要查找的字符串大致的目录位置不清除具体路径,通过递归搜索查找到
-L:输出时只显示不包含匹配项的文件名。
-l ----只显示匹配字符串的文件名不显示匹配的行,通常和-r 一起使用
<code>[root@justin ~]</code><code># mkdir -p /home/grep/{grep1,grep2}</code>
<code>[root@justin ~]</code><code># touch /home/grep/grep1/a.txt</code>
<code>[root@justin ~]</code><code># echo "1 2 3" > /home/grep/grep1/a.txt</code>
<code>[root@justin ~]</code><code># touch /home/grep/grep1/1.txt</code>
<code>[root@justin ~]</code><code># echo "a b c" > /home/grep/grep1/1.txt</code>
<code>[root@justin ~]</code><code># grep "a" /home/grep/</code>
<code>[root@justin ~]</code><code># grep "a" -r /home/grep/</code>
<code>/home/grep/grep1/1</code><code>.txt:a b c</code>
<code>[root@justin ~]</code><code># grep "a" -rl /home/grep/</code>
<code>/home/grep/grep1/1</code><code>.txt</code>
<code>[root@justin ~]</code><code>#</code>
-n或--line-number---在显示符合范本样式的那一行之前,标示出该列的行数编号
<code>[root@localhost ~]</code><code># cat /boot/grub/grub.conf | grep -n title</code>
<code>14:title Red Hat Enterprise Linux (2.6.32-279.el6.i686)</code>
-o:只显示被模式匹配到的字符串,而不是整个行
<code>[root@localhost ~]</code><code># cat /boot/grub/grub.conf | grep -no title</code>
<code>14:title</code>
-h:输出时每行行首不显示文件名
。-H:输出时每行行首显示文件名。
-w, –word-regexp:精确匹配,匹配单词还不是字符串,如想匹配“justin”,”justin_peng”就不会被匹配
\<: 单词锚定词首,例如\<r..t 那么root、rooter均可以匹配,而chroot就不能匹配
\>: 单词锚定词尾,例如r..t\> 那么root、chroot均可匹配,而chroot就不能匹配,如果要锚定root 可以使用\<root\>
<code>[root@justin home]</code><code># cat grep.txt </code>
<code>justin</code>
<code>justin_peng</code>
<code>[root@justin home]</code><code># grep "justin" grep.txt </code>
<code>[root@justin home]</code><code># grep -w "justin" grep.txt </code>
<code>[root@justin home]</code><code>#</code>
-R, -r, –recursive:递归搜索, 查找你搜索的目录或子目录下的所有含有某个你要找的文件.
<code>[root@justin </code><code>grep</code><code>]</code><code># grep "justin" /home/</code>
<code>[root@justin </code><code>grep</code><code>]</code><code># grep -R "justin" /home/</code>
<code>/home/grep/grep</code><code>.txt:justin</code>
<code>/home/grep</code><code>.txt:justin</code>
<code>/home/grep</code><code>.txt:justin_peng</code>
<code>[root@justin </code><code>grep</code><code>]</code><code>#</code>
正则匹配:
符号”[]“表示匹配指定范围内的任意单个字符,'passw[Oo]rd'匹password和passwOrd
<code>[root@justin ~]</code><code># echo "password" > /home/grep/grep1/a.txt</code>
<code>[root@justin ~]</code><code># echo "passwOrd" >> /home/grep/grep1/a.txt</code>
<code>[root@justin ~]</code><code># grep -nr 'passw[oO]rd' /home/grep/</code>
<code>/home/grep/grep1/a</code><code>.txt:1:password</code>
<code>/home/grep/grep1/a</code><code>.txt:2:passwOrd</code>
[] 里面不论有几个字节,他都谨一个一个字节的匹配,也就是只会匹配password和passwOrd,而不会匹配passwoOrd,在一组集合字节中,如果该字节组是连续的,例如大写英文/小写英文/数字等等, 就可以使用[a-z],[A-Z],[0-9],[a-zA-Z]等方式来书写
如果要匹配空格,最好用空格的[:space:]来匹配,如果直接用空格来匹配那么tab产生的空格是不会匹配的
<code>[root@justin ~]</code><code># grep '[[:space:]]' grep.txt</code>
[[:alpha:]] 代表英文大小写字母 a-z A-Z
[[:upper:]] :表示大写字母[A-Z]
[[:alnum:]]: 所有的字母和数字
[[:blank:]] [[:space:]] 代表空格键与 [Tab] 按键两者
[[:digit:]] :表示数字 [0-9]
符号"[^]"表示匹配指定范围之外的任意单个字符,如:'[^a-fA-F]oo'匹配不包含A-F和a-f的一个字母开头,紧跟oo的行。
<code>[root@justin ~]</code><code># echo "Google" > /home/grep/grep1/1.txt</code>
<code>[root@justin ~]</code><code># echo "google" >> /home/grep/grep1/1.txt</code>
<code>[root@justin ~]</code><code># echo "Foogle" >> /home/grep/grep1/1.txt</code>
<code>[root@justin ~]</code><code># echo "foogle" >> /home/grep/grep1/1.txt</code>
<code>[root@justin ~]</code><code># cat /home/grep/grep1/1.txt</code>
<code>Google</code>
<code>google</code>
<code>Foogle</code>
<code>foogle</code>
<code>[root@justin ~]</code><code># grep '[^a-fA-F]oo' /home/grep/grep1/1.txt</code>
符号“^”表示以什么字符开头,“^word”表示以“word”开头,如果word前面有空格时需要使用[:space:]来匹配前面的空格[root@Zabbix_server home]# grep '^[[:space:]]*root' punct.txt
符号“$”表示以什么字符结尾,“word$”表示以“word”结尾。如果word后面有符号匹配时候需要使用[:punct:]来匹配后的符号[root@Zabbix_server home]# grep 'root[[:punct:]]*$' punct.txt 表示匹配punct.txt文件中以root单词结尾后面接任意多个符号的行
匹配行尾为小数点(.)因为小数点具有其他意义(底下会介绍),所以必须要使用转义字符(\)来加以解除其特殊意义,转义为一个普通字符!
<code>[root@justin ~]</code><code># grep '.$' /home/grep/grep1/a.txt</code>
<code>grep</code>
<code>grap</code>
<code>grbp</code>
<code>grabp</code>
<code>grcbp</code>
<code>grcbp.</code>
<code>[root@justin ~]</code><code># grep '\.' /home/grep/grep1/a.txt</code>
小数点”.“表示任意一个非换行符的字符,'gr.p'匹配gr后接一个任意字符,然后是p
<code>[root@justin ~]</code><code># echo "grep" > /home/grep/grep1/a.txt</code>
<code>[root@justin ~]</code><code># echo "grap" >> /home/grep/grep1/a.txt</code>
<code>[root@justin ~]</code><code># echo "grbp" >> /home/grep/grep1/a.txt</code>
<code>[root@justin ~]</code><code># echo "grabp" >> /home/grep/grep1/a.txt</code>
<code>[root@justin ~]</code><code># echo "grcbp" >> /home/grep/grep1/a.txt</code>
<code>[root@justin ~]</code><code># grep 'gr.p' /home/grep/grep1/a.txt</code>
星号“*”:基本正则表达式中表示匹配其前的字符出现0次或任意次数,例如ab*c,那么ac、abc、acc都会匹配,而abdc就不匹配,星号在基本正则表达式里只指次数,*不会匹配隐藏文件。只表示次数,不表示任意字符
扩展正则表达式中多以下元字符:
+ 匹配一个或多个前面的字符.它的作用和*很相似,但唯一的区别是它不匹配零个字 符的情况,如果要指定范围使用{n,m}来指定,如查找一位或2位数值的行:
<code>[root@Zabbix_server ~]</code><code># egrep --color=auto '\<[0-9]{1,3}[[:space:]]' /proc/meminfo </code>
<code>[root@Zabbix_server ~]</code><code># egrep --color=auto '\<[0-9]{3}[[:space:]]' /proc/meminfo </code>
<code>[root@Zabbix_server ~]</code><code># egrep --color=auto '\<[0-9]+[[:space:]]' /proc/meminfo</code>
| 表示或关系
例如egrep 'abc|def' /proc/meminfo 查找abc或者def
分组
例如 egrep 'abc|def' /proc/meminfo 查找abc或者def
egrep 'ab(c|d)ef' /proc/meminfo 查找abcef或者abdef
<code>[root@Zabbix_server home]</code><code># egrep 'abc|def' 12.txt --color=auto</code>
<code>abc</code>
<code>abcdef</code>
<code>abcef</code>
<code>abdef</code>
<code>[root@Zabbix_server home]</code><code># egrep 'ab(c|d)ef' 12.txt --color=auto</code>
<code>[root@Zabbix_server home]</code><code>#</code>
问号“?”:基本正则表达式中表示匹配其前的字符出现0次或1次数。只做次数匹配,不做字符匹配
<code>[root@justin ~]</code><code># echo "google" > /home/grep/grep1/a.txt</code>
<code>[root@justin ~]</code><code># echo "goooooooooooooogle" >> /home/grep/grep1/a.txt</code>
<code>[root@justin ~]</code><code># grep 'g..gle' /home/grep/grep1/a.txt</code>
<code>[root@justin ~]</code><code># grep 'g*gle' /home/grep/grep1/a.txt</code>
<code>goooooooooooooogle</code>
<code>[root@justin ~]</code><code># grep 'g.gle' /home/grep/grep1/a.txt</code>
如果想查找两个字符之间任意个字符的条件,可以通过小数点和星号一起来匹配,如查找前尾分别为gr和g的行
<code>[root@justin ~]</code><code># grep 'gr.*g' /home/grep/grep1/a.txt</code>
字符范围\{m,n \}:限制前一个字符重复出现最少m次,最多n次数
因为 { 与 } 的符号在 shell 是有特殊意义的,因此必须要使用字符 \ 来让他失去特殊意义
\{m,\} 表示至少m次,
\{0,n\} 表示最多n次,不能使用\{,n\}
\{m\} 表示只出现m次
() 将候选的所有元素放在()内,用|隔开
"a(1|2|3)bc"满足的例子a1bc、mba3bcd
如果要以组的形式匹配,例如xaby 要匹配ab组合出现多次可以使用\(\)来匹配,例如x\(ab\)*y,表示xy中间中ab出现0次或n次
前向引用
<code>[root@Zabbix_server home]</code><code># cat 1.txt </code>
<code>He love his lover.</code>
<code>She like her liker.</code>
<code>He love his liker.</code>
<code>She like her lover.</code>
例如要匹配love和lover、like和liker同时所在行
<code>[root@Zabbix_server home]</code><code># grep '\(l..e\).*\1r' 1.txt </code>
这里\1表示匹配第一个左括号内l..e相同的内容,\(l\(..\)e\).*\2r表示匹配\(..\)这个内..相同的内容,以此类推
查找出现两个o的行:
<code>[root@justin ~]</code><code># cat /home/grep/grep1/a.txt</code>
<code>"Open Source"</code> <code>is a good mechanism to develop programs.</code>
<code>apple is my favorite food.</code>
<code>Football game is not use feet only.</code>
<code>Oh! The soup taste good.</code>
<code>google is the best tools </code><code>for</code> <code>search ke</code>
<code>goooooogle </code><code>yes</code><code>!</code>
<code>[root@justin ~]</code><code># grep 'o\{2\}' /home/grep/grep1/a.txt</code>
查找g后面出现2到5次o,然后紧跟g的行:
<code>[root@justin ~]</code><code># grep 'go\{2,5\}g' /home/grep/grep1/a.txt</code>
查找g后面出现两次以上o后面跟g的行:
<code>[root@justin ~]</code><code># grep 'go\{2,\}g' /home/grep/grep1/a.txt</code>
<code>[root@justin ~]</code><code># grep 'go*g' /home/grep/grep1/a.txt</code>
字符类
代表意义
[:alnum:]
代表英文大小写字符及数字,即0-9,A-Z,a-z
[:alpha:]
代表任何英文大小字符,即A-Z,a-z
[:lower:]
代表小写字符,即a-z
[:upper:]
代表大写字符,即A-Z
[:digit:]
代表数字,即0-9
[:xdigit:]
代表十六进制的数字类型,因此包括0-9,A-F,a-f的数字与字符
[:blank:]
代表空格键与tab按键
[:graph:]
除了空格与tab按键之外的其它所有按键
[:space:]
任何会产生空白的字符,包括空格键,Tab键,CR等
[:cntrl:]
代表键盘上面的控制按键,既包括CR,LF,Tab,Del等
[:print:]
代表任意可打印字符
[:punct:]
代表标点符号,即" ' ? ! ; : # $
cat
cat只适合查看内容较短的文件,无法上翻页,只能显示、查看一屏内容
tac同上,只是倒叙显示内容
<code>[root@justin home]</code><code># cat test</code>
<code>111</code>
<code>222</code>
<code>333</code>
<code>[root@justin home]</code><code># tac test</code>
more
more适合查看长文件,可以上、下翻页,按空格键下翻一页,按Enter下翻一行,按b上翻一页,cat和more可以配合使用
<code>[root@justin log]</code><code># more boot.log</code>
<code>[root@justin log]</code><code># cat boot.log |more</code>
less
less使用查看长文件,而且可以搜索【关键词】,按N/n查找前后关键字
<code>[root@justin log]</code><code># less secure</code>
<code>Jan 22 10:58:30 justin sshd[1716]: Server listening on :: port 22.</code>
<code>Jan 22 10:59:12 justin sshd[1901]: Accepted password </code><code>for</code> <code>root from 10.15.72.73 port 60959 ssh2</code>
<code>Jan 22 10:59:13 justin sshd[1901]: pam_unix(sshd:session): session opened </code><code>for</code> <code>user root by (uid=0)</code>
<code>Jan 22 10:59:13 justin sshd[1901]: subsystem request </code><code>for</code> <code>sftp</code>
<code>/port</code> <code>22</code>
head
查看文件头N行数据,默认头10,通过-n指定查看行数;
<code>[root@justin log]</code><code># head -n 2 secure</code>
<code>Nov 13 17:31:16 localhost sshd[1582]: Server listening on 0.0.0.0 port 22.</code>
<code>Nov 13 17:31:16 localhost sshd[1582]: Server listening on :: port 22.</code>
<code>[root@justin log]</code><code>#</code>
tail
查看文件末尾n行,用法同上;参数-f动态实时
<code>[root@justin log]</code><code># tail -n 2 secure -f</code>
<code>[root@justin log]</code><code># tail -fn 2 secure</code>
<code></code>
本文转自 justin_peng 51CTO博客,原文链接:http://blog.51cto.com/ityunwei2017/1301078,如需转载请自行联系原作者