grep

1. 介绍

 Linux grep命令用于查找文件里符合条件的字符串。作为linux中最为常用的三大文本(awk,sed,grep)处理工具之一。

语法

grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help]    [范本样式][文件或目录...]
首先谈一下grep命令的常用格式为:grep  [选项]  ”模式“  [文件]

grep家族总共有三个:grepegrepfgrep

grep -E =egrep

参数

  • -a 或 --text : 不要忽略二进制的数据。
  • -A<显示行数> 或 --after-context=<显示行数> : 除了显示符合范本样式的那一列之外,并显示该行之后的内容。
  • -b 或 --byte-offset : 在显示符合样式的那一行之前,标示出该行第一个字符的编号。
  • -B<显示行数> 或 --before-context=<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前的内容。
  • -c 或 --count : 计算符合样式的列数。
  • -C<显示行数> 或 --context=<显示行数>或-<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前后的内容。
  • -d <动作> 或 --directories=<动作> : 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
  • -e<范本样式> 或 --regexp=<范本样式> : 指定字符串做为查找文件内容的样式。
  • -E 或 --extended-regexp : 将样式为延伸的普通表示法来使用。
  • -f<规则文件> 或 --file=<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
  • -F 或 --fixed-regexp : 将样式视为固定字符串的列表。
  • -G 或 --basic-regexp : 将样式视为普通的表示法来使用。
  • -h 或 --no-filename : 在显示符合样式的那一行之前,不标示该行所属的文件名称。
  • -H 或 --with-filename : 在显示符合样式的那一行之前,表示该行所属的文件名称。
  • -i 或 --ignore-case : 忽略字符大小写的差别。
  • -l 或 --file-with-matches : 列出文件内容符合指定的样式的文件名称。
  • -L 或 --files-without-match : 列出文件内容不符合指定的样式的文件名称。
  • -n 或 --line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。
  • -o 或 --only-matching : 只显示匹配PATTERN 部分。
  • -q 或 --quiet或--silent : 不显示任何信息。
  • -r 或 --recursive : 此参数的效果和指定"-d recurse"参数相同。
  • -s 或 --no-messages : 不显示错误信息。
  • -v 或 --revert-match : 显示不包含匹配文本的所有行。
  • -V 或 --version : 显示版本信息。
  • -w 或 --word-regexp : 只显示全字符合的列。
  • -x --line-regexp : 只显示全列符合的列。
  • -y : 此参数的效果和指定"-i"参数相同。

常用选项

-E :开启扩展(Extend)的正则表达式。
-i :忽略大小写(ignore case)。
-v :反过来(invert),只打印没有匹配的,而匹配的反而不打印。
-n :显示行号
-w :被匹配的文本只能是单词,而不能是单词中的某一部分,如文本中有liker,而我搜寻的只是like,就可以使用-w选项来避免匹配liker
-c :显示总共有多少行被匹配到了,而不是显示被匹配到的内容,注意如果同时使用-cv选项是显示有多少行没有被匹配到。
-o :只显示被模式匹配到的字符串。
--color :将匹配到的内容以颜色高亮显示。
-A  n:显示匹配到的字符串所在的行及其后n行,after
-B  n:显示匹配到的字符串所在的行及其前n行,before
-C  n:显示匹配到的字符串所在的行及其前后各n行,context

2. 例子

grep -c "48" test.txt 统计所有以“48”字符开头的行有多少
grep -i "May" test.txt 不区分大小写查找“May”所有的行)
grep -n "48" test.txt 显示行号;显示匹配字符“48”的行及行号,相同于 nl test.txt |grep 48)
grep -v "48" test.txt 显示输出没有字符“48”所有的行)
grep "471" test.txt 显示输出字符“471”所在的行)
grep "48;" test.txt 显示输出以字符“48”开头,并在字符“48”后是一个tab键所在的行
grep "48[34]" test.txt 显示输出以字符“48”开头,第三个字符是“3”或是“4”的所有的行)
grep "^[^48]" test.txt 显示输出行首不是字符“48”的行)
grep "[Mm]ay" test.txt 设置大小写查找:显示输出第一个字符以“M”或“m”开头,以字符“ay”结束的行)
grep "K…D" test.txt 显示输出第一个字符是“K”,第二、三、四是任意字符,第五个字符是“D”所在的行)
grep "[A-Z][9]D" test.txt 显示输出第一个字符的范围是“A-D”,第二个字符是“9”,第三个字符的是“D”的所有的行
grep "[35]..1998" test.txt 显示第一个字符是3或5,第二三个字符是任意,以1998结尾的所有行
grep "4\{2,\}" test.txt 模式出现几率查找:显示输出字符“4”至少重复出现两次的所有行
grep "9\{3,\}" test.txt 模式出现几率查找:显示输出字符“9”至少重复出现三次的所有行
grep "9\{2,3\}" test.txt 模式出现几率查找:显示输出字符“9”重复出现的次数在一定范围内,重复出现2次或3次所有行
grep -n "^$" test.txt 显示输出空行的行号
ls -l |grep "^d" 如果要查询目录列表中的目录 同:ls -d *
ls -l |grep "^d[d]" 在一个目录中查询不包含目录的所有文件
ls -l |grpe "^d…..x..x" 查询其他用户和用户组成员有可执行权限的目录集合

元数据

[root@cai ~]# ls
data
[root@cai ~]# cat data 
root:x:0:0:root:/root:/bin/bash
ROOT:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
cmz:x:1000:1000::/home/cmz:/bin/bash
yzc:x:1001:1000::/home/yzc:/bin/bash
YZC:x:1001:1000::/home/yzc:/bin/bash
YZC123:x:1001:1000::/home/yzc123:/bin/bash

带行号显示
[root@cai ~]# cat -n data 
     1  root:x:0:0:root:/root:/bin/bash
     2  ROOT:x:0:0:root:/root:/bin/bash
     3  bin:x:1:1:bin:/bin:/sbin/nologin
     4  ntp:x:38:38::/etc/ntp:/sbin/nologin
     5  nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
     6  cmz:x:1000:1000::/home/cmz:/bin/bash
     7  yzc:x:1001:1000::/home/yzc:/bin/bash
     8  YZC:x:1001:1000::/home/yzc:/bin/bash
     9  YZC123:x:1001:1000::/home/yzc123:/bin/bash

2.1 不带参数

[root@cai ~]# grep  yzc data 
yzc:x:1001:1000::/home/yzc:/bin/bash
YZC:x:1001:1000::/home/yzc:/bin/bash
YZC123:x:1001:1000::/home/yzc123:/bin/bash

匹配到数据不分大小写,属于贪婪匹配,只有包含的yzc都过滤处理。

2.2 显示行号 -n

[root@cai ~]# grep -n yzc data 
7:yzc:x:1001:1000::/home/yzc:/bin/bash
8:YZC:x:1001:1000::/home/yzc:/bin/bash
9:YZC123:x:1001:1000::/home/yzc123:/bin/bash

匹配到的数据显示当前的行号

2.3 显示匹配到的总行数 -c

[root@cai ~]# grep yzc data 
yzc:x:1001:1000::/home/yzc:/bin/bash
YZC:x:1001:1000::/home/yzc:/bin/bash
YZC123:x:1001:1000::/home/yzc123:/bin/bash
[root@cai ~]# grep -c  yzc data 
3

2.4 只显示匹配的元素 -o

[root@cai ~]# grep yzc data 
yzc:x:1001:1000::/home/yzc:/bin/bash
YZC:x:1001:1000::/home/yzc:/bin/bash
YZC123:x:1001:1000::/home/yzc123:/bin/bash
[root@cai ~]# grep  -o yzc data 
yzc
yzc
yzc
yzc
[root@cai ~]# grep  -on yzc data 
7:yzc
7:yzc
8:yzc
9:yzc

2.5 精确匹配 -w |\b

[root@cai ~]# grep  yzc data 
yzc:x:1001:1000::/home/yzc:/bin/bash
YZC:x:1001:1000::/home/yzc:/bin/bash
YZC123:x:1001:1000::/home/yzc123:/bin/bash
[root@cai ~]# 
[root@cai ~]# grep -w yzc data 
yzc:x:1001:1000::/home/yzc:/bin/bash
YZC:x:1001:1000::/home/yzc:/bin/bash

-w表示精确匹配,不是包含关系,比如是精确。

[root@cai ~]# cat cdata 
cmz1234
cmz12345
ccmz123
cccmz12
ccccmz1
cccccmz
[root@cai ~]# grep '\bcmz1234\b' cdata 
cmz1234
[root@cai ~]# grep -w 'cmz1234' cdata 
cmz1234

2.6 忽略大小写 -i

[root@cai ~]# cat data 
root:x:0:0:root:/root:/bin/bash
ROOT:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
cmz:x:1000:1000::/home/cmz:/bin/bash
yzc:x:1001:1000::/home/yzc:/bin/bash
YZC:x:1001:1000::/home/yzc:/bin/bash
YZC123:x:1001:1000::/home/yzc123:/bin/bash
[root@cai ~]# grep root data 
root:x:0:0:root:/root:/bin/bash
ROOT:x:0:0:root:/root:/bin/bash
[root@cai ~]# grep ROOT data 
ROOT:x:0:0:root:/root:/bin/bash
[root@cai ~]# grep -i  ROOT data 
root:x:0:0:root:/root:/bin/bash
ROOT:x:0:0:root:/root:/bin/bash

2.7 排除 -v

只打印没有匹配的,而匹配的反而不打印。

[root@cai ~]# cat data 
root:x:0:0:root:/root:/bin/bash
ROOT:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
cmz:x:1000:1000::/home/cmz:/bin/bash
yzc:x:1001:1000::/home/yzc:/bin/bash
YZC:x:1001:1000::/home/yzc:/bin/bash
YZC123:x:1001:1000::/home/yzc123:/bin/bash
[root@cai ~]# grep yzc data 
yzc:x:1001:1000::/home/yzc:/bin/bash
YZC:x:1001:1000::/home/yzc:/bin/bash
YZC123:x:1001:1000::/home/yzc123:/bin/bash
[root@cai ~]# grep -v yzc data 
root:x:0:0:root:/root:/bin/bash
ROOT:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
cmz:x:1000:1000::/home/cmz:/bin/bash

2.8 高亮显示

[root@cai ~]# grep --color yzc data 
yzc:x:1001:1000::/home/yzc:/bin/bash
YZC:x:1001:1000::/home/yzc:/bin/bash
YZC123:x:1001:1000::/home/yzc123:/bin/bash
[root@cai ~]# alias |grep grep 
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'

默认匹配到的数据是高亮显示的

2.9 显示匹配到后N行 -A

显示匹配到的字符串所在的行及其后n行,after

[root@cai ~]# cat data 
root:x:0:0:root:/root:/bin/bash
ROOT:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
cmz:x:1000:1000::/home/cmz:/bin/bash
yzc:x:1001:1000::/home/yzc:/bin/bash
YZC:x:1001:1000::/home/yzc:/bin/bash
YZC123:x:1001:1000::/home/yzc123:/bin/bash
[root@cai ~]# grep cmz data 
cmz:x:1000:1000::/home/cmz:/bin/bash
[root@cai ~]# grep -A1 cmz data 
cmz:x:1000:1000::/home/cmz:/bin/bash
yzc:x:1001:1000::/home/yzc:/bin/bash
[root@cai ~]# grep -A2 cmz data 
cmz:x:1000:1000::/home/cmz:/bin/bash
yzc:x:1001:1000::/home/yzc:/bin/bash
YZC:x:1001:1000::/home/yzc:/bin/bash

2.10 显示匹配到前N行 -B

显示匹配到的字符串所在的行及其后n行,before

[root@cai ~]# cat data 
root:x:0:0:root:/root:/bin/bash
ROOT:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
cmz:x:1000:1000::/home/cmz:/bin/bash
yzc:x:1001:1000::/home/yzc:/bin/bash
YZC:x:1001:1000::/home/yzc:/bin/bash
YZC123:x:1001:1000::/home/yzc123:/bin/bash
[root@cai ~]# grep cmz data 
cmz:x:1000:1000::/home/cmz:/bin/bash
[root@cai ~]# grep -B1 cmz data 
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
cmz:x:1000:1000::/home/cmz:/bin/bash
[root@cai ~]# grep -B2 cmz data 
ntp:x:38:38::/etc/ntp:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
cmz:x:1000:1000::/home/cmz:/bin/bash

2.11 显示匹配到前后N行 -C

显示匹配到的字符串所在的行及其后n行,context

[root@cai ~]# cat data 
root:x:0:0:root:/root:/bin/bash
ROOT:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
cmz:x:1000:1000::/home/cmz:/bin/bash
yzc:x:1001:1000::/home/yzc:/bin/bash
YZC:x:1001:1000::/home/yzc:/bin/bash
YZC123:x:1001:1000::/home/yzc123:/bin/bash
[root@cai ~]# grep cmz data 
cmz:x:1000:1000::/home/cmz:/bin/bash
[root@cai ~]# grep -C1 cmz data 
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
cmz:x:1000:1000::/home/cmz:/bin/bash
yzc:x:1001:1000::/home/yzc:/bin/bash
[root@cai ~]# grep -C2 cmz data 
ntp:x:38:38::/etc/ntp:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
cmz:x:1000:1000::/home/cmz:/bin/bash
yzc:x:1001:1000::/home/yzc:/bin/bash
YZC:x:1001:1000::/home/yzc:/bin/bash

2.12 空行 ^$

[root@cai ~]# cat  ndata 
1

2
3
[root@cai ~]# grep '^$' ndata 

[root@cai ~]# grep -v '^$' ndata 
1
2
3
[root@cai ~]# grep -n '^$' ndata 
2:

2.13 多参数匹配

怎么使用 grep 的“或”匹配? 就是使用 | 加上-E

[root@cai ~]# cat edata 
root:x:0:0:root:/cmz
ROOT:x:0:0:root:ROOT
yzc:x:1001:1000::/home/yzc
yz1c:x:1001:1000::/home/yzc
yz12c:x:1001:1000::/home/yz12c
cdyzc:x:1001:1000::/cdyzc
YZC:x:1001:1000::/home/YZC
YZC123:x:1001:1000::/home/YZC123
123
456
abc
edf
[root@cai ~]# grep '123|abc' edata  # 错误。必须加-E或者使用egrep
[root@cai ~]# grep -E '123|abc' edata 
YZC123:x:1001:1000::/home/YZC123
123
abc
[root@cai ~]# egrep '123|abc' edata 
YZC123:x:1001:1000::/home/YZC123
123
abc

3. 正则表达式

正则表达式就是用于匹配每行输入的一种模式,模式是指一串字符序列

^ 锚定行的开始 如:'^grep'匹配所有以grep开头的行。 
$ 锚定行的结束 如:'grep$'匹配所有以grep结尾的行。 
. 匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。 
+ 匹配前面的子表达式一次或多次。
? 匹配前面的子表达式,最多一次。
* 匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。 .*一起用代表任意字符。
[] 匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。 
[^] 匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。 
\(..\) 标记匹配字符,如'\(love\)',love被标记为1。 
\ 锚定单词的开始,如:'\匹配包含以grep开头的单词的行。 
\> 锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。 
x\{m\} 重复字符x,m次,如:'0\{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。
\b 单词锁定符,如: '\bgrep\b'只匹配grep。

3.1 以什么开头 ^

[root@cai ~]# cat edata 
root:x:0:0:root:/cmz
ROOT:x:0:0:root:ROOT
yzc:x:1001:1000::/home/yzc
cdyzc:x:1001:1000::/cdyzc
YZC:x:1001:1000::/home/YZC
YZC123:x:1001:1000::/home/YZC123
[root@cai ~]# grep '^c' edata 
cdyzc:x:1001:1000::/cdyzc
[root@cai ~]# grep '^y' edata 
yzc:x:1001:1000::/home/yzc
[root@cai ~]# grep -i '^y' edata 
yzc:x:1001:1000::/home/yzc
YZC:x:1001:1000::/home/YZC
YZC123:x:1001:1000::/home/YZC123

-i 忽视大小写,^ 以什么为开头

3.2 以什么结尾 $

[root@cai ~]# cat edata 
root:x:0:0:root:/cmz
ROOT:x:0:0:root:ROOT
yzc:x:1001:1000::/home/yzc
cdyzc:x:1001:1000::/cdyzc
YZC:x:1001:1000::/home/YZC
YZC123:x:1001:1000::/home/YZC123
[root@cai ~]# grep "z$" edata 
root:x:0:0:root:/cmz
[root@cai ~]# grep "3$" edata 
YZC123:x:1001:1000::/home/YZC123

3.2 匹配一个非换行符的字符 .

[root@cai ~]# cat edata 
root:x:0:0:root:/cmz
ROOT:x:0:0:root:ROOT
yzc:x:1001:1000::/home/yzc
yz1c:x:1001:1000::/home/yzc
yz12c:x:1001:1000::/home/yz12c
cdyzc:x:1001:1000::/cdyzc
YZC:x:1001:1000::/home/YZC
YZC123:x:1001:1000::/home/YZC123
[root@cai ~]# grep "yz.c" edata 
yz1c:x:1001:1000::/home/yzc
[root@cai ~]# grep "yz..c" edata 
yz12c:x:1001:1000::/home/yz12c

. 表示一个任意占用符。'yz.c'匹配gr后接一个任意字符。

3.3 匹配零个或多个先前字符 *

'*grep'匹配所有一个或多个空格后紧跟grep的行。 .*一起用代表任意字符。

[root@cai ~]# cat edata 
root:x:0:0:root:/cmz
ROOT:x:0:0:root:ROOT
yzc:x:1001:1000::/home/yzc
yz1c:x:1001:1000::/home/yzc
yz12c:x:1001:1000::/home/yz12c
cdyzc:x:1001:1000::/cdyzc
YZC:x:1001:1000::/home/YZC
YZC123:x:1001:1000::/home/YZC123
[root@cai ~]# grep 'yz*' edata 
yzc:x:1001:1000::/home/yzc
yz1c:x:1001:1000::/home/yzc
yz12c:x:1001:1000::/home/yz12c
cdyzc:x:1001:1000::/cdyzc

3.4 匹配一个指定范围内的字符 []

[] 匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。

[root@cai ~]# grep '[1-9]' edata 
yzc:x:1001:1000::/home/yzc
yz1c:x:1001:1000::/home/yzc
yz12c:x:1001:1000::/home/yz12c
cdyzc:x:1001:1000::/cdyzc
YZC:x:1001:1000::/home/YZC
YZC123:x:1001:1000::/home/YZC123

[root@cai ~]# grep '[2-3]' edata 
yz12c:x:1001:1000::/home/yz12c
YZC123:x:1001:1000::/home/YZC123

3.5 匹配一个不在指定范围内的字符 [^]

[^] 匹配一个不在指定范围内的字符,如: ^[a-z]匹配不包含a-z

[root@cai ~]# cat edata 
root:x:0:0:root:/cmz
ROOT:x:0:0:root:ROOT
yzc:x:1001:1000::/home/yzc
yz1c:x:1001:1000::/home/yzc
yz12c:x:1001:1000::/home/yz12c
cdyzc:x:1001:1000::/cdyzc
YZC:x:1001:1000::/home/YZC
YZC123:x:1001:1000::/home/YZC123
123
456
abc
edf
[root@cai ~]# grep '[^a-z]' edata 
root:x:0:0:root:/cmz
ROOT:x:0:0:root:ROOT
yzc:x:1001:1000::/home/yzc
yz1c:x:1001:1000::/home/yzc
yz12c:x:1001:1000::/home/yz12c
cdyzc:x:1001:1000::/cdyzc
YZC:x:1001:1000::/home/YZC
YZC123:x:1001:1000::/home/YZC123
123
456

注意颜色

3.6 标记匹配字符 (..)

\(..\) 标记匹配字符,如'\(cmz\)',cmz被标记为1。 
\ 锚定单词的开始,如:'\匹配包含以grep开头的单词的行。 
\> 锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。 
[root@cai ~]# cat edata 
root:x:0:0:root:/cmz
ROOT:x:0:0:root:ROOT
yzc:x:1001:1000::/home/yzc
yz1c:x:1001:1000::/home/yzc
yz12c:x:1001:1000::/home/yz12c
cdyzc:x:1001:1000::/cdyzc
YZC:x:1001:1000::/home/YZC
YZC123:x:1001:1000::/home/YZC123
123
456
abc
edf
[root@cai ~]# grep '\(cmz\)' edata 
root:x:0:0:root:/cmz

3.7 重复

x\{m\} 重复字符x,m次,如:'c\{5\}'匹配包含5个c的行。 
x\{m,\} 重复字符x,至少m次,如:'c\{5,\}'匹配至少有5个o的行。 
x\{m,n\}重复字符x,至少m次,不多于n次,如:'c\{5,10\}'匹配5--10个c的行
[root@cai ~]# cat edata 
root:x:0:0:root:/cmz
ROOT:x:0:0:root:ROOT
yzc:x:1001:1000::/home/yzc
yz1c:x:1001:1000::/home/yzc
yz12c:x:1001:1000::/home/yz12c
cdyzc:x:1001:1000::/cdyzc
YZC:x:1001:1000::/home/YZC
YZC123:x:1001:1000::/home/YZC123
123
456
abc
edf
[root@cai ~]# cat cdata 
cmz1234
cmz12345
ccmz123
cccmz12
ccccmz1
cccccmz
[root@cai ~]# grep 'c\{1\}' cdata 
cmz1234
cmz12345
ccmz123
cccmz12
ccccmz1
cccccmz
[root@cai ~]# grep 'c\{1,\}' cdata 
cmz1234
cmz12345
ccmz123
cccmz12
ccccmz1
cccccmz
[root@cai ~]# grep 'c\{2,3\}' cdata 
ccmz123
cccmz12
ccccmz1
cccccmz
[root@cai ~]# grep 'c\{4,\}' cdata 
ccccmz1
cccccmz
[root@cai ~]# egrep 'c{2,3}' cdata 
ccmz123
cccmz12
ccccmz1
cccccmz
[root@cai ~]# egrep 'c{2}' cdata 
ccmz123
cccmz12
ccccmz1
cccccmz
[root@cai ~]# egrep 'c{2,}' cdata 
ccmz123
cccmz12
ccccmz1
cccccmz

3.8 特殊

放在括号内的表达式,即包在 "[:" 和 ":]" 之间的字符类的名字,它表示的是属于此类的所有字符列表。标准的字符类名称如下:
[[:alnum:]] - 字母数字字符
[[:alpha:]] - 字母字符
[[:blank:]] - 空字符: 空格键符 和 制表符
[[:digit:]] - 数字: '0 1 2 3 4 5 6 7 8 9'
[[:lower:]] - 小写字母: 'a b c d e f g h i j k l m n o p q r s t u v w x y z'
[[:space:]] - 空格字符: 制表符、换行符、垂直制表符、换页符、回车符和空格键符
[[:upper:]] - 大写字母: 'A B C D E F G H I J K L M N O P Q R S T U V W X Y Z'
[root@cai ~]# cat adata 
123
abc
ABC
a12b
AB23

AAA

[root@cai ~]# grep  [[:space:]] adata 
[root@cai ~]# grep  [[:upper:]] adata 
ABC
AB23
AAA
[root@cai ~]# grep  [[:lower:]] adata 
abc
a12b
[root@cai ~]# grep  [[:digit:]] adata 
123
a12b
AB23
[root@cai ~]# grep  [[:blank:]] adata 
[root@cai ~]# grep  [[:alpha:]] adata 
abc
ABC
a12b
AB23
AAA
[root@cai ~]# grep  [[:alnum:]] adata 
123
abc
ABC
a12b
AB23
AAA

其他

grep -c "48" test.txt 统计所有以“48”字符开头的行有多少
grep -i "May" test.txt 不区分大小写查找“May”所有的行)
grep -n "48" test.txt 显示行号;显示匹配字符“48”的行及行号,相同于 nl test.txt |grep 48)
grep -v "48" test.txt 显示输出没有字符“48”所有的行)
grep "471" test.txt 显示输出字符“471”所在的行)
grep "48;" test.txt 显示输出以字符“48”开头,并在字符“48”后是一个tab键所在的行
grep "48[34]" test.txt 显示输出以字符“48”开头,第三个字符是“3”或是“4”的所有的行)
grep "^[^48]" test.txt 显示输出行首不是字符“48”的行)
grep "[Mm]ay" test.txt 设置大小写查找:显示输出第一个字符以“M”或“m”开头,以字符“ay”结束的行)
grep "K…D" test.txt 显示输出第一个字符是“K”,第二、三、四是任意字符,第五个字符是“D”所在的行)
grep "[A-Z][9]D" test.txt 显示输出第一个字符的范围是“A-D”,第二个字符是“9”,第三个字符的是“D”的所有的行
grep "[35]..1998" test.txt 显示第一个字符是3或5,第二三个字符是任意,以1998结尾的所有行
grep "4\{2,\}" test.txt 模式出现几率查找:显示输出字符“4”至少重复出现两次的所有行
grep "9\{3,\}" test.txt 模式出现几率查找:显示输出字符“9”至少重复出现三次的所有行
grep "9\{2,3\}" test.txt 模式出现几率查找:显示输出字符“9”重复出现的次数在一定范围内,重复出现2次或3次所有行
grep -n "^$" test.txt 显示输出空行的行号
ls -l |grep "^d" 如果要查询目录列表中的目录 同:ls -d *
ls -l |grep "^d[d]" 在一个目录中查询不包含目录的所有文件
ls -l |grpe "^d…..x..x" 查询其他用户和用户组成员有可执行权限的目录集合