linux grep命令总结

linux grep命令总结

简介

grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

grep常用用法

[root@www ~]# grep [-acinv] [--color=auto] '搜寻字符串' filename

选项与参数:

-a :将 binary 文件以 text 文件的方式搜寻数据

-c :计算找到 '搜寻字符串' 的次数

-i :忽略大小写的不同,所以大小写视为相同

-n :顺便输出行号

-s 不显示错误信息
-E 使用扩展正则表达式

-v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!

--color=auto :可以将找到的关键词部分加上颜色的显示喔!

pattern正则表达式主要参数:
\: 忽略正则表达式中特殊字符的原有含义。
^:匹配正则表达式的开始行。
$: 匹配正则表达式的结束行。
\<:从匹配正则表达 式的行开始。
\>:到匹配正则表达式的行结束。
[ ]:单个字符,如[A]即A符合要求 。
[ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。
。:所有的单个字符。
* :有字符,长度可以为0。

\< 和 \> 分别标注单词的开始与结尾。
例如:
grep man * 会匹配 ‘Batman’、’manic’、’man’等,
grep ‘\<man’ * 匹配’manic’和’man’,但不是’Batman’,
grep ‘\<man\>’ 只匹配’man’,而不是’Batman’或’manic’等其他的字符串。

将/etc/passwd,有出现 root 的行取出来

# grep root /etc/passwd

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

# cat /etc/passwd | grep root 

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

可以使用国际模式匹配的类名:

[[:upper:]]   [A-Z]
[[:lower:]]   [a-z]
[[:digit:]]   [0-9]
[[:alnum:]]   [0-9a-zA-Z]
[[:space:]]   空格或tab
[[:alpha:]]   [a-zA-Z]


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这个单词,两边均为空格。

find与xargs

find . -type f -print | xargs file 查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件

find / -name "core" -print | xargs echo "" >/tmp/core.log 在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中:

find . -type f -print | xargs grep "hostname" 用grep命令在所有的普通文件中搜索hostname这个词

find ./ -mtime +3 -print|xargs rm -f –r 删除3天以前的所有东西 (find . -ctime +3 -exec rm -rf {} \;)

find ./ -size 0 | xargs rm -f & 删除文件大小为零的文件

find命令配合使用exec和xargs可以使用户对所匹配到的文件执行几乎所有的命令。

find命令的常用选项及实例

-name

按照文件名查找文件。 
find /dir -name filename  在/dir目录及其子目录下面查找名字为filename的文件 
find . -name "*.c" 在当前目录及其子目录(用“.”表示)中查找任何扩展名为“c”的文件

-perm 
按照文件权限来查找文件。 
find . -perm 755 –print 在当前目录下查找文件权限位为755的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件

-prune 
使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。 
find /apps -path "/apps/bin" -prune -o –print 在/apps目录下查找文件,但不希望在/apps/bin目录下查找 
find /usr/sam -path "/usr/sam/dir1" -prune -o –print 在/usr/sam目录下查找不在dir1子目录之内的所有文件

-user 
按照文件属主来查找文件。 
find ~ -user sam –print 在$HOME目录中查找文件属主为sam的文件

-group 
按照文件所属的组来查找文件。 
find /apps -group gem –print 在/apps目录下查找属于gem用户组的文件 

-mtime -n +n 
按照文件的更改时间来查找文件, - n表示文件更改时间距现在n天以内,+ n表示文件更改时间距现在n天以前。 
find / -mtime -5 –print 在系统根目录下查找更改时间在5日以内的文件 
find /var/adm -mtime +3 –print 在/var/adm目录下查找更改时间在3日以前的文件

-nogroup 
查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。 
find / –nogroup -print

-nouser 
查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。 
find /home -nouser –print

-newer file1 ! file2 
查找更改时间比文件file1新但比文件file2旧的文件。

-type 
查找某一类型的文件,诸如: 
b - 块设备文件。 
d - 目录。 
c - 字符设备文件。 
p - 管道文件。 
l - 符号链接文件。 
f - 普通文件。 
find /etc -type d –print 在/etc目录下查找所有的目录 
find . ! -type d –print 在当前目录下查找除目录以外的所有类型的文件 
find /etc -type l –print 在/etc目录下查找所有的符号链接文件

-size n:[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。 
find . -size +1000000c –print 在当前目录下查找文件长度大于1 M字节的文件 
find /home/apache -size 100c –print 在/home/apache目录下查找文件长度恰好为100字节的文件 
find . -size +10 –print 在当前目录下查找长度超过10块的文件(一块等于512字节)

-depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。 
find / -name "CON.FILE" -depth –print 它将首先匹配所有的文件然后再进入子目录中查找 

-mount:在查找文件时不跨越文件系统mount点。  
find . -name "*.XC" -mount –print 从当前目录开始查找位于本文件系统中文件名以XC结尾的文件(不进入其他文件系统)

-follow:如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。

将/etc/passwd,有出现 root 的行取出来,同时显示这些行在/etc/passwd的行号

# grep -n root /etc/passwd
3:root:x:0:0:root:/root:/bin/bash
5:operator:x:11:0:operator:/root:/sbin/nologin

grep 可以使用 --color=auto 来将关键字部分使用颜色显示。你可以在 ~/.bashrc 内加上这行:『alias grep='grep --color=auto'』再以『 source ~/.bashrc 』来立即生效。

将/etc/passwd,将root行过滤掉,不出现带有root字符的行。

[root@www script]# grep -v root /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
将带有root的字符已经过滤掉了。

将/etc/passwd中,过滤掉root 和nologin,不出现带有root 和nologin字符的行。

[root@www script]# grep -v root /etc/passwd|grep -v nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
将带有root 和nologin的字已经过滤掉了。

根据文件内容递归查找目录

# grep ‘mysql’ *           #在当前目录搜索带'energywise'行的文件

# grep -r ‘mysql’ *        #在当前目录及其子目录下搜索'energywise'行的文件
# grep -l -r ‘mysql’ *     #在当前目录及其子目录下搜索'energywise'行的文件,但是不显示匹配的行,只显示匹配的文件

grep与正规表达式

[root@www script]# grep "google\>" regular.txt 

.google is the best tools for search keyword.

[root@www script]# grep "\<google" regular.txt  

.google is the best tools for search keyword.

[root@www script]# grep "\<goog" regular.txt   

.google is the best tools for search keyword.

[root@www script]# grep "\<goo" regular.txt              模糊匹配关键字

Oh! The soup taste good.

.google is the best tools for search keyword.

gooogle yes!

[root@www script]# grep "goo\>" regular.txt              没有匹配到关键字

[root@www script]# grep "google\>" regular.txt 

.google is the best tools for search keyword.

[root@www script]# grep "\<google\>" regular.txt      精确匹配关键字

.google is the best tools for search keyword.

[root@www script]# grep "\<google" regular.txt         精确匹配关键字

.google is the best tools for search keyword.

[root@www script]# grep "google" regular.txt             精确匹配关键字

.google is the best tools for search keyword.

[root@www script]# grep "\<[Gg]oogle" regular.txt   

google is the best tools for search keyword.

Google is the best tools for search keyword.


字符类

字符类的搜索:如果我想要搜寻 test 或 taste 这两个单字时,可以发现到,其实她们有共通的 't?st' 存在~这个时候,我可以这样来搜寻:

[root@www ~]# grep -n 't[ae]st' regular.txt 

5:I can't finish the test.

7:Oh! The soup taste good.

字符类的反向选择 [^] :如果想要搜索到有 oo 的行,但不想要 oo 前面有 g,如下

[root@www ~]# grep -n '[^g]oo' regular.txt 

2:apple is my favorite food.

3:Football game is not use feet only.

9:google is the best tools for search keyword.

11:goooooogle yes!

第 2,3 行没有疑问,因为 foo 与 Foo 均可被接受,但是第 9 行明明有 google 的 goo 啊,别忘记了,因为该行后面出现了 tool 的 too 啊!所以该行也被列出来,也就是说, 9 行里面虽然出现了我们所不要的项目 (goo) 但是由于有需要的项目 (too) , 因此是符合字串搜寻的。

至于第 11 行,同样的,因为 goooooogle 里面的 oo 前面可能是 o ,例如: go(ooo)oogle ,所以,这一行也是符合需求的。

假设我 oo 前面不想要有小写字母,所以我可以这样写 [^abcd....z]oo,但是这样并不方便,由于小写字母的 ASCII 上编码的顺序是连续的, 因此,我们可以这样来写:

[root@www ~]# grep -n '[^a-z]oo' regular.txt 

3:Football game is not use feet only.

如果该字节组是连续的,例如大写英文/小写英文/数字等等, 就可以使用[a-z],[A-Z],[0-9]等方式来书写,那么如果我们的要求字串是数字与英文呢? 就将他全部写在一起,变成:[a-zA-Z0-9]。

我们要取得有数字的那一行,就这样:

[root@www ~]# grep -n '[0-9]' regular.txt 
5:However, this dress is about $ 3183 dollars.
8:You are the best is mean you are the no. 1.

行首与行尾字节 ^ $
行首字符:如果我想要让 the 只在行首列出呢? 这个时候就得要使用定位字节了!我们可以这样做:

[root@www ~]# grep -n '^the' regular_express.txt
12:the symbol '*' is represented as start.

如果我不想要开头是英文字母,则可以是这样:

[root@www ~]# grep -n '^[^a-zA-Z]' regular.txt
1:"Open Source" is a good mechanism to develop programs.
11:# I am VBird

注意:因为小数点具有其他意义,所以必须要使用转义字符(\)来加以解除其特殊意义!

找出空白行:

[root@www ~]# grep -n '^$' regular_express.txt
5:

因为只有行首跟行尾 (^$),所以,这样就可以找出空白行啦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章