grep -io "http:/=[A-Z0-9]\{16\}" ./wsxf.txt >wsxf_urls.txt
grep用法详解:grep与正则表达式
首先要记住的是: 正则表达式与通配符不一样,它们表示的含义并不相同!
正则表达式只是一种表示法,只要工具支持这种表示法, 那么该工具就可以处理正则表达式的字符串。vim、grep、awk 、sed 都支持正则表达式,也正是因为由于它们支持正则,才显得它们强大;
1基础正则表达式
grep 工具,以前介绍过。
grep -[acinv] '搜索内容串' filename
-a 以文本文件方式搜索
-c 计算找到的符合行的次数
-i 忽略大小写
-n 顺便输出行号
-v 反向选择,即显示不包含匹配文本的所有行
-h 查询多文件时不显示文件名。
-l 查询多文件时只输出包含匹配字符的文件名。
-s 不显示不存在或无匹配文本的错误信息。
grep命令加- E参数,这一扩展允许使用扩展模式匹配。
其中搜索串可以是正则表达式!
---
先用例子说明问题:
以下为整理的grep 正则表达式的大部分功能,详细参见man
grep: 要用好grep这个工具,其实就是要写好正则表达式,所以这里不对grep的所有功能进行实例讲解,只列几个例子,讲解一个正则表达式的写法。
$ ls -l | grep '^a' 通过管道过滤ls -l输出的内容,只显示以a开头的行。
$ grep 'test' d* 显示所有以d开头的文件中包含test的行。
$ grep 'test' aa bb cc 显示在aa,bb,cc文件中匹配test的行。
$ grep '[a-z]/{5/}' aa 显示所有包含每个字符串至少有5个连续小写字符的字符串的行。
$ grep 'w/(es/)t.*/1' aa 如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.*),这些字符后面紧跟着另外一个es(/1),找到就显示该行。如果用egrep或grep -E,就不用"/"号进行转义,直接写成'w(es)t.*/1'就可以了。
grep正则表达式元字符集(基本集)
^ 锚定行的开始 如:'^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结尾的单词的行。
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的反置形式,匹配一个或多个非单词字符,如点号句号等。
/b 单词锁定符,如: '/bgrep/b'只匹配grep。
关于匹配的实例:
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" 查询其他用户和用户组成员有可执行权限的目录集合
更多的例子:
1
搜索有the的行,并输出行号
$grep -n 'the' regular_express.txt
搜 索没有the的行,并输出行号
$grep -nv 'the' regular_express.txt
2 利 用[]搜索集合字符
[] 表示其中的某一个字符 ,例如[ade] 表示a或d或e
woody@xiaoc:~/tmp$ grep -n 't[ae]st' regular_express.txt
8:I can't finish the test.
9:Oh! the soup taste good!
可以用^符号做[]内的前缀,表示除[]内的字符之外的字 符。
比如搜索oo前没有g的字符串所在的行. 使用 '[^g]oo' 作搜索字符串
woody@xiaoc:~/tmp$ grep -n '[^g]oo' regular_express.txt
2:apple is my favorite food.
3:Football game is not use feet only.
18:google is the best tools for search keyword.
19:goooooogle yes!
[] 内可以用范围表示,比如[a-z] 表示小写字母,[0-9] 表示0~9的数字, [A-Z] 则是大写字母们。[a-zA-Z0-9]表示所有数字与英文字符。 当然也可以配合^来排除字符。
搜索包含数字的行
woody@xiaoc:~/tmp$ grep -n '[0-9]' regular_express.txt
5:However ,this dress is about $ 3183 dollars.
15:You are the best is menu you are the no.1.
行首与行尾字符 ^ $. ^ 表示行的开头,$表示行的结尾( 不是字符,是位置)那么‘^$’ 就表示空行,因为只有
行首和行尾。
这里^与[]里面使用的^意义不同。它表示^后面的串是在行的开头。
比如搜索the在开头的行
woody@xiaoc:~/tmp$ grep -n '^the' regular_express.txt
12:the symbol '*' is represented as star.
搜索以小写字母开头的行
woody@xiaoc:~/tmp$ grep -n '^[a-z]' regular_express.txt
2:apple is my favorite food.
4:this dress doesn't fit me.
10:motorcycle is cheap than car.
12:the symbol '*' is represented as star.
18:google is the best tools for search keyword.
19:goooooogle yes!
20:go! go! Let's go.
woody@xiaoc:~/tmp$
搜索开头不是英文字母的行
woody@xiaoc:~/tmp$ grep -n '^[^a-zA-Z]' regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
21:#I am VBird
woody@xiaoc:~/tmp$
$表示它前面的串是在行的结尾,比如 '/.' 表示 . 在一行的结尾
搜索末尾是.的行
woody@xiaoc:~/tmp$ grep -n '/.$' regular_express.txt //. 是正则表达式的特殊符号,所以要用/转义
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
4:this dress doesn't fit me.
5:However ,this dress is about $ 3183 dollars.
6:GNU is free air not free beer.
.....
注意在MS的系统下生成的文本文件,换行会加上一个 ^M 字符。所以最后的字符会是隐藏的^M ,在处理Windows
下面的文本时要特别注意!
可以用cat dos_file | tr -d '/r' > unix_file 来删除^M符号。 ^M==/r
那么'^$' 就表示只有行首行尾的空行拉!
搜索空行
woody@xiaoc:~/tmp$ grep -n '^$' regular_express.txt
22:
23:
woody@xiaoc:~/tmp$
搜索非空行
woody@xiaoc:~/tmp$ grep -vn '^$' regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
4:this dress doesn't fit me.
grep、egrep和fgrep命令--Linux文件内容查询命令
1.命令功能:
grep命令用来在文本文件中查找指定模式的词或短语,并在标准输出上显示包括给定字符串模式的所有行;
egrep命令等同于grep -E,可以使用扩展的字符串模式进行搜索;
fgrep命令等同于grep -F,是快速搜索命令,它检索固定字符串,但不识别正则表达式。
2.一般格式:
grep [选项] [查找模式] [文件名1,文件名2,……]
fgrep [选项] [查找模式] [文件名1,文件名2,……]
egrep [选项] [查找模式] [文件名1,文件名2,……]
3.常用选项:
- E 每个模式作为一个扩展的正则表达式对待。
- F 每个模式作为一组固定字符串对待(以新行分隔),而不作为正则表达式。
- b在输出的每一行前显示包含匹配字符串的行在文件中的字节偏移量。
- c 只显示匹配行的数量。
- i 比较时不区分大小写。
- h 在查找多个文件时,指示grep不要将文件名加入到输出之前。
- l 显示首次匹配串所在的文件名并用换行符将其隔开。当在某文件中多次出现匹配串时,不重复显示此文件名。
- n 在输出前加上匹配串所在行的行号(文件首行行号为1)。
- v 只显示不包含匹配串的行。
- x 只显示整行严格匹配的行。
- e expression 指定检索使用的模式。用于防止以“-”开头的模式被解释为命令选项。
- f expfile 从expfile文件中获取要搜索的模式,一个模式占一行
4.注意以下方面:
在命令后键入搜索的模式,再键入要搜索的文件。其中,文件名列表中也可以使用特殊字符,如“*”等,用来生成文件名列表。如果想在搜索的模式中包含有空格的字符串,可以用单引号把要搜索的模式括起来,用来表明搜索的模式是由包含空格的字符串组成。否则,Shell将把空格认为是命令行参数的定界符,而grep命令将把搜索模式中的单词解释为文件名列表中的一部分。在下面的例子中,grep命令在文件example中搜索模式“text file”。
$ grep ’text file’ example
用户可以在命令行上用Shell特殊字符来生成将要搜索的文件名列表。在下面的例子中,特殊字符“*”用来生成一个文件名列表,该列表包含当前目录下所有的文件。该命令将搜索出当前目录下所有文件中与模式匹配的行。
$ grep data *
特殊字符在搜索一组指定的文件时非常有用。例如,如果想搜索所有的C程序源文件中特定的模式,您可以用“*.c”来指定文件名列表。假设用户的 C程序中包含一些不必要的转向语句(goto语句),想要找到这些语句,可以用如下的命令来搜索并显示所有包含goto语句的代码行:
$ grep goto *.c
用户可以在命令行上键入搜索模式,也可以使用-f选项从指定文件中读取要搜索的模式。在文件中,每个搜索模式占一行。如果经常要搜索一组常见字符串时, 这个功能非常有用。在下面的例子中,用户要在文件exam中搜索字符串“editor”和“create”,就把要搜索的模式放置在文件mypats中, 然后,grep命令从文件mypats中读取要搜索的模式。
$ cat mypats
editor
create
$ grep -f mypats exam
grep不查找隐藏文件夹的方法
默认的grep会搜索所有文件,包括隐藏文件夹下的文件。
例如,使用如下命令搜索MediaButton字符串,搜索结果包含隐藏文件夹下的文件。
grep -nr MediaButton *
如果是用svn管理的代码,每个文件夹下都有一个.svn的隐藏文件夹,包含对代码版本的控制信息,日积月累会越来越庞大。所有如果只是默认搜索的话,很多搜索结果都是svn目录下的,对我们来说,是没有价值的内容;而且还会耗费很多时间。
grep的--exclude-dir=参数就是为了排除某个目录的,即不包含等号后面的目录,所以我们可以利用此参数去掉.svn的隐藏目录。
--exclude-dir=参数的用法如下:
1. If you have GNU Grep, it should work like this:
---=".svn"
例如:查找当前目录以及子目录下所有包含"MediaButton"字符串的代码并打印行号
grep -nr --exclude-dir=".svn" MediaButton *
或者
grep -nr --exclude-dir=\.svn MediaButton *
--exclude-dir=后面要排除的目录用双引号括起来或者直接接目录名都可以,但是特殊字符必须用转义符表示,例如".svn"中的"."。
2.If happen to be on a Unix System without GNU Grep, try the following:
这种方式是使用管道进行双层“过滤”,其中第二次grep使用了-v选项,即逆向匹配,打印出不匹配的行
-"whatever you like"*|-"\.svn/*"
3. 如果每次都输入--exclude-dir=参数,是不是很慢还容易出错,降低效率呢?
不过不用担心,我们可以把--exclude-dir=参数通过加入配置文件 ~/.bashrc (这是bash的当前用户配置文件) 的方法来简化操作,提高效率。
在~/.bashrc文件的末尾添加以下命令:
export GREP_OPTIONS="--exclude-dir=\.svn"
然后保存,执行source ~/.bashrc或者. ~/.bashrc,使修改起作用。
然后搜索时,执行以下命令即可:
grep -nr MediaButton *
这样默认就会加载GREP_OPTIONS选项,不搜索.svn目录。
需要注意的是,GREP_OPTIONS这个关键词不能修改为其他的,否则系统就不会认为是grep的一个选项参数了。
grep命令的用法
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
#2.格式
grep [options]
#3.主要参数
[options]主要参数:
-c:只输出匹配行的计数。
-I:不区分大 小写(只适用于单字符)。
-h:查询多文件时不显示文件名。
-l:查询多文件时只输出包含匹配字符的文件名。
-n:显示匹配行及 行号。
-s:不显示不存在或无匹配文本的错误信息。
-v:显示不包含匹配文本的所有行。
pattern正则表达式主要参数:
\: 忽略正则表达式中特殊字符的原有含义。
^:匹配正则表达式的开始行。
$: 匹配正则表达式的结束行。
\<:从匹配正则表达 式的行开始。
\>:到匹配正则表达式的行结束。
[ ]:单个字符,如[A]即A符合要求 。
[ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。
。:所有的单个字符。
* :有字符,长度可以为0。
#4.grep命令使用简单实例
$ grep ‘test’ d*
显示所有以d开头的文件中包含 test的行。
$ grep ‘test’ aa bb cc
显示在aa,bb,cc文件中匹配test的行。
$ grep ‘[a-z]\{5\}’ aa
显示所有包含每个字符串至少有5个连续小写字符的字符串的行。
$ grep ‘w\(es\)t.*\1′ aa
如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.*),这些字符后面紧跟着 另外一个es(\1),找到就显示该行。如果用egrep或grep -E,就不用”\”号进行转义,直接写成’w(es)t.*\1′就可以了。
#5.grep命令使用复杂实例
假设您正在’/usr/src/Linux/Doc’目录下搜索带字符 串’magic’的文件:
$ grep magic /usr/src/Linux/Doc/*
sysrq.txt:* How do I enable the magic SysRQ key?
sysrq.txt:* How do I use the magic SysRQ key?
其中文件’sysrp.txt’包含该字符串,讨论的是 SysRQ 的功能。
默认情况下,’grep’只搜索当前目录。如果 此目录下有许多子目录,’grep’会以如下形式列出:
grep: sound: Is a directory
这可能会使’grep’ 的输出难于阅读。这里有两种解决的办法:
明确要求搜索子目录:grep -r
或忽略子目录:grep -d skip
如果有很多 输出时,您可以通过管道将其转到’less’上阅读:
$ grep magic /usr/src/Linux/Documentation/* | less
这样,您就可以更方便地阅读。
#有一点要注意,您必需提供一个文件过滤方式(搜索全部文件的话用 *)。如果您忘了,’grep’会一直等着,直到该程序被中断。如果您遇到了这样的情况,按 <CTRL c> ,然后再试。
#下面还有一些有意思的命令行参数:
grep -i pattern files :不区分大小写地搜索。默认情况区分大小写,
grep -l pattern files :只列出匹配的文件名,
grep -L pattern files :列出不匹配的文件名,
grep -w pattern files :只匹配整个单词,而不是字符串的一部分(如匹配’magic’,而不是’magical’),
grep -C number pattern files :匹配的上下文分别显示[number]行,
grep pattern1 | pattern2 files :显示匹配 pattern1 或 pattern2 的行,
grep pattern1 files | grep pattern2 :显示既匹配 pattern1 又匹配 pattern2 的行。
#grep -n pattern files 即可显示行号信息
#grep -c pattern files 即可查找总行数
#这里还有些用于搜索的特殊符号:
\< 和 \> 分别标注单词的开始与结尾。
例如:
grep man * 会匹配 ‘Batman’、’manic’、’man’等,
grep ‘\<man’ * 匹配’manic’和’man’,但不是’Batman’,
grep ‘\<man\>’ 只匹配’man’,而不是’Batman’或’manic’等其他的字符串。
‘^’:指匹配的字符串在行首,
‘$’:指匹配的字符串在行 尾,
#Grep 命令 用法大全
1、参数:
-I :忽略大小写
-c :打印匹配的行数
-l :从多个文件中查找包含匹配项
-v :查找不包含匹配项的行
-n:打印包含匹配项的行和行标
2、RE(正则表达式)
\ 忽略正则表达式中特殊字符的原有含义
^ 匹配正则表达式的开始行
$ 匹配正则表达式的结束行
\< 从匹配正则表达式的行开始
\> 到匹配正则表达式的行结束
[ ] 单个字符;如[A] 即A符合要求
[ - ] 范围 ;如[A-Z]即A,B,C一直到Z都符合要求
. 所有的单个字符
* 所有字符,长度可以为0
3、举例
# ps -ef | grep in.telnetd
root 19955 181 0 13:43:53 ? 0:00 in.telnetd
# more size.txt size文件的内容
b124230
b034325
a081016
m7187998
m7282064
a022021
a061048
m9324822
b103303
a013386
b044525
m8987131
B081016
M45678
B103303
BADc2345
## more size.txt | grep '[a-b]' 范围 ;如[A-Z]即A,B,C一直到Z都符合要求
b124230
b034325
a081016
a022021
a061048
b103303
a013386
b044525
# more size.txt | grep '[a-b]'*
b124230
b034325
a081016
m7187998
m7282064
a022021
a061048
m9324822
b103303
a013386
b044525
m8987131
B081016
M45678
B103303
BADc2345
## more size.txt | grep 'b' 单个字符;如[A] 即A符合要求
b124230
b034325
b103303
b044525
# more size.txt | grep '[bB]'
b124230
b034325
b103303
b044525
B081016
B103303
BADc2345
## grep 'root' /etc/group
root::0:root
bin::2:root,bin,daemon
sys::3:root,bin,sys,adm
adm::4:root,adm,daemon
uucp::5:root,uucp
mail::6:root
tty::7:root,tty,adm
lp::8:root,lp,adm
nuucp::9:root,nuucp
daemon::12:root,daemon
## grep '^root' /etc/group 匹配正则表达式的开始行
root::0:root
## grep 'uucp' /etc/group
uucp::5:root,uucp
nuucp::9:root,nuucp
## grep '\<uucp' /etc/group#
uucp::5:root,uucp
## grep 'root$' /etc/group 匹配正则表达式的结束行
root::0:root
mail::6:root
## more size.txt | grep -i 'b1..*3' -i :忽略大小写
#b124230
b103303
B103303
## more size.txt | grep -iv 'b1..*3' -v :查找不包含匹配项的行
#b034325
a081016
m7187998
m7282064
a022021
a061048
m9324822
a013386
b044525
m8987131
B081016
M45678
BADc2345
## more size.txt | grep -in 'b1..*3'
1:b124230
9:b103303
15:B103303
## grep '$' /etc/init.d/nfs.server | wc -l
128
# grep '\$' /etc/init.d/nfs.server | wc –l 忽略正则表达式中特殊字符的原有含义
#15
# grep '\$' /etc/init.d/nfs.server
case "$1" in
>/tmp/sharetab.$$
[ "x$fstype" != xnfs ] &&
echo "$path\t$res\t$fstype\t$opts\t$desc"
>>/tmp/sharetab.$$
/usr/bin/touch -r /etc/dfs/sharetab /tmp/sharetab.$$
/usr/bin/mv -f /tmp/sharetab.$$ /etc/dfs/sharetab
if [ -f /etc/dfs/dfstab ] && /usr/bin/egrep -v '^[ ]*(#|$)'
if [ $startnfsd -eq 0 -a -f /etc/rmmount.conf ] &&
if [ $startnfsd -ne 0 ]; then
elif [ ! -n "$_INIT_RUN_LEVEL" ]; then
while [ $wtime -gt 0 ]; do
wtime=`expr $wtime - 1`
if [ $wtime -eq 0 ]; then
echo "Usage: $0 { start | stop }"
## more size.txt
#the test file
their are files
The end
## grep 'the' size.txt
the test file
their are files
## grep '\<the' size.txt
the test file
their are files
## grep 'the\>' size.txt
the test file
## grep '\<the\>' size.txt
the test file
## grep '\<[Tt]he\>' size.txt
the test file
#==================================================================
#1,简介
使用正则表达式的一个多用途文本搜索工具.这个php?name=%C3%FC%C1%EE" onclick="tagshow(event)" class="t_tag">命令本来是ed行编辑器中的一个php?name=%C3%FC%C1%EE" onclick="tagshow(event)" class="t_tag">命令/过滤器:
g/re/p -- global - regular expression - print.
基本格式
grep pattern [file...]
(1)grep 搜索字符串 [filename]
(2)grep 正则表达式 [filename]
在文件中搜索所有 pattern 出现的位置, pattern 既可以是要搜索的字符串,也可以是一个正则表达式.
注意:在输入要搜索的字符串时最好使用双引号/而在模式匹配使用正则表达式时,注意使用单引号
2,grep的选项
-c 只输出匹配行的计数
-i 不区分大小写(用于单字符)
-n 显示匹配的行号
-v 不显示不包含匹配文本的所以有行
-s 不显示错误信息
-E 使用扩展正则表达式
更多的选项请查看:man grep
3,常用grep实例
#(1)多个文件查询
grep "sort" *.doc #见文件名的匹配
(2)行匹配:输出匹配行的计数
grep -c "48" data.doc #输出文档中含有48字符的行数
(3)显示匹配行和行数
grep -n "48" data.doc #显示所有匹配48的行和行号
(4)显示非匹配的行
grep -vn "48" data.doc #输出所有不#包含48的行
(4)显示非匹配的行
grep -vn "48" data.doc #输出所有不包含48的行
(5)大小写敏感
grep -i "ab" data.doc #输出所有含有ab或Ab的字符串的行
4, 正则表达式的应用
(1)正则表达式的应用 (注意:最好把正则表达式用单引号括起来)
grep '[239].' data.doc #输出所有含有以2,3或9开头的,并且是两个数字的行
(2)不匹配测试
grep '^[^48]' data.doc #不匹配行首是48的行
(3)使用扩展模式匹配
grep -E '219|216' data.doc
(4) ...
这需要在实践中不断应用和总结,熟练掌握正则表达式。
5, 使用类名
可以使用国际模式匹配的类名:
[[:upper:]] [A-Z]
[[:lower:]] [a-z]
[[:digit:]] [0-9]
[[:alnum:]] [0-9a-zA-Z]
[[:space:]] 空格或tab
[[:alpha:]] [a-zA-Z]
(1)使用
grep '5[[:upper:]][[:upper:]]' data.doc #查询以5开头以两个大写字母结尾的行
Linux正则表达式grep与egrep
正则表达式:它是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索或替换那些符合某个模式的文本内容。
其实正则表达式,只是一种思想,一种表示方法。只要我们使用的工具支持表示这种思想那么这个工具就可以处理正则表达式的字符串。常用的工具有grep, sed, awk,这三个都是针对文本的行才操作的。
grep 过滤器
语法: grep [-cinvABC] 'word' filename
-n 显示行号
-c count统计符合要求的行数
-v 取反,不包含所选字符的
-i 不区分大小写
-r 会把目录下面所有的文件遍历 例如: grep -r 'root' ./
-A 后面跟数字,A2表示打印符合要求的行及下面二行
-B 后面跟数字,B2表示打印符合要求的行及上面二行
-C 后面跟数字,C2表示打印符合要求的行及上下各二行
^ 行首,开头
$ 行尾,结尾
空行用 ^$ 表示
可以做一个别名alias grep="grep --color" 写入到.bashrc里面;以后输入grep命令时查找的关键字符会颜色显示,方便区分。
过滤带有某个关键词的行并输出行号,颜色显示关键词
[root@localhost ~]# grep -n --color 'root' passwd
1:root:x:0:0:root:/root:/bin/bash
11:operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# grep -o --color 'root' passwd | wc -l
4
加-o 统计包含关键词的个数;
过滤不带有某个关键词的行,并输出行号;
[root@ linuxidc.com ~]# grep -nv 'nologin' /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
6:sync:x:5:0:sync:/sbin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:halt:x:7:0:halt:/sbin:/sbin/halt
20:user1:x:600:501::/home/user1:/bin/bash
23:mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
过滤以nologin结尾的,系统禁止登陆的所有用户;
[root@localhost ~]# grep 'nologin$' /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
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
示例,打印关键字halt所在行的A2 B2 C2
[root@ linuxidc.com ~]# grep -A2 'halt' passwd
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
[root@ linuxidc.com ~]# grep -B2 'halt' passwd
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@ linuxidc.com ~]# grep -C2 'halt' passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
把所有以#号开头的行去除
[root@ linuxidc.com ~]# grep -v '^#' /etc/inittab
id:3:initdefault:
去除所有空行和以#号开头的行
[root@ linuxidc.com ~]# grep -v '^#' /etc/crontab |grep -v '^$'
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
示例说明,打印数字或字母开头,及不是字母和数字开头的;
[root@ linuxidc.com tmp]# cat test.txt
helloworld
abc
abc11111
#differt
12345
67899
123def
[0-9]代表任意一个数字,整个命令意思筛选出包含任意一个数字的行;
[root@ linuxidc.com tmp]# grep '[0-9]' test.txt
abc11111
12345
67899
123def
[^0-9]代表除0-9之外的任意一个字符,整个命令的意思是筛选出不包含数字的行;
[root@ linuxidc.com tmp]# grep '[^0-9]' test.txt
helloworld
abc
abc11111
#differt
123def
^[^0-9]代表不是数字开头的;
[root@ linuxidc.com tmp]# grep '^[^0-9]' test.txt
helloworld
abc
abc11111
#differt
[a-z]代表任意一个英文字母;
[root@ linuxidc.com tmp]# grep '[a-z]' test.txt
helloworld
abc
abc11111
#differt
123def
[^a-z]代表除英文字母以外的;
[root@ linuxidc.com tmp]# grep '[^a-z]' test.txt
abc11111
#differt
12345
67899
123def
^[^a-z]代表不是英文字母开头的文本;
[root@ linuxidc.com tmp]# grep '^[^a-z]' test.txt
#differt
12345
67899
123def
[ ] 如果是数字的话就用[0-9]这样的形式,当然有时候也可以用这样的形式[15]即只含有1或者5,注意,它不会认为是15。如果要过滤出数字以及大小写 字母则要这样写[0-9a-zA-Z]。另外[ ]还有一种形式,就是[^字符] 表示除[ ]内的字符之外的字符。
过滤任意一个字符与重复字符
[root@ linuxidc.com ~]# grep 'h..t' /etc/passwd
halt:x:7:0:halt:/sbin:/sbin/halt
'.'点表示任意的一个字符,上面例子为把符合h与t之间有2个任意字符的行过滤出来。
'*'代表零个或多个任意的字符
'ooo*'代表oo,ooo,oooo 或者更多的o
[root@ linuxidc.com ~]# grep 'ooo*' /etc/passwd
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
'.*'表示零个或多个任意字符,等于所有的,空行也包含在内。
[root@ linuxidc.com ~]# grep '.*' /etc/passwd |wc -l
24
[root@ linuxidc.com ~]# wc -l /etc/passwd
24 /etc/passwd
指定要过滤字符出现的次数
{ }内部为数字,表示前面字符要重复的次数。表示两个O即包含OO的行。{ }左右都需要加脱意字符\
grep -E 代表增强版的grep即egrep,使用egrep不需要脱意;
123456789 [root@ linuxidc.com ~]# grep 'o\{2\}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
[root@localhost ~]# grep -E 'o{2}' passwd
[root@localhost ~]# egrep 'o{2}' passwd
[root@ linuxidc.com ~]# cat test.txt
root:hot
abcde
spoool
spool
spol
spl
示例,过滤字母o出现1到3次的行
[root@ linuxidc.com ~]# grep 'o\{1,3\}' test.txt
root:hot
spoool
spool
spol
{ } 还可以表示一个范围,格式为{n1,n2} n1<n2 表示重复n1到n2次前面的字符,n2还可以为空,则表示大于等于n1次。
egrep为grep的扩展版本,我们可以用egrep完成grep不能完成的工作,当然了grep能完成的egrep完全可以完成。
grep -E = egrep
1、筛选一个或一个以上前面的字符 字符后面使用+
[root@ linuxidc.com ~]# cat test.txt
rot:x:0:0:rot:/rot:/bin/bash
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooot:x:0:0/roooooot:/bin/bash
11111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[root@ linuxidc.com ~]# egrep 'o+' test.txt
rot:x:0:0:rot:/rot:/bin/bash
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooot:x:0:0/roooooot:/bin/bash
[root@ linuxidc.com ~]# egrep 'oo+' test.txt
root:x:0:0:root:/root:/bin/bash
rooooot:x:0:0/roooooot:/bin/bash
[root@ linuxidc.com ~]# egrep 'ooo+' test.txt
rooooot:x:0:0/roooooot:/bin/bash
2、筛选零个或一个前面的字符 字符后面使用?
[root@ linuxidc.com ~]# egrep 'o?' test.txt
rot:x:0:0:rot:/rot:/bin/bash
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooot:x:0:0/roooooot:/bin/bash
11111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[root@ linuxidc.com ~]# egrep 'oo?' test.txt
rot:x:0:0:rot:/rot:/bin/bash
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooot:x:0:0/roooooot:/bin/bash
[root@ linuxidc.com ~]# egrep 'ooo?' test.txt
root:x:0:0:root:/root:/bin/bash
rooooot:x:0:0/roooooot:/bin/bash
[root@ linuxidc.com ~]# egrep 'oooo?' test.txt
rooooot:x:0:0/roooooot:/bin/bash
3、筛选字符串1或字符串2 包含里面任意一个字符串的打印出来
[root@ linuxidc.com ~]# egrep 'aaa|111|ooo' test.txt
rooooot:x:0:0/roooooot:/bin/bash
11111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
4、egrep中()的应用
[root@ linuxidc.com ~]# egrep 'r(oo)|(mo)n' test.txt
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooot:x:0:0/roooooot:/bin/bash
用( )表示一个整体,例如(oo)+ 表示1个'oo'或者多个'oo'
[root@ linuxidc.com ~]# egrep '(oo)+' test.txt
root:x:0:0:root:/root:/bin/bash
rooooot:x:0:0/roooooot:/bin/bash
5、egrep中[ ]的应用
方括号内的字符为其中的一个;[^o]为除了字母o之外的;
示例:r开头t结尾的;;
[root@localhost ~]# egrep 'r[o]t' test.txt
rot:x:0:0:rot:/rot:/bin/bash
r开头后面有o的
[root@localhost ~]# egrep 'r[o]' test.txt
rot:x:0:0:rot:/rot:/bin/bash
root:x:0:0:root:/root:/bin/bash
rooooot:x:0:0/roooooot:/bin/bash
r开头后面不是o的;
[root@localhost ~]# egrep 'r[^o]' test.txt
rrt
rtx
t为结尾的前面字符不是o的;
[root@localhost ~]# egrep '[^o]t' test.txt
rrt
rtx
. * + ? 符号的总结
. 表示任意一个字符(包括特殊字符 空格 # $ ?)
* 表示零个或多个*前面的字符
.* 表示任意个任意字符(包含空行)
+ 表示1个或多个+前面的字符
? 表示0个或1个?前面的字符
其中,+ ? grep不支持,egrep才支持。
"ro.*t" 表示以ro开头一直到t结尾的
[root@localhost ~]# grep 'ro.*t' test.txt
rot:x:0:0:rot:/rot:/bin/bash
root:x:0:0:root:/root:/bin/bash
rooooot:x:0:0/roooooot:/bin/bash
图片显示的更详细,方便大家理解。
grep如果需要筛选字符串 | 管道需要加脱意\才可以使用;
grep使用简明及正则表达式 http://www.linuxidc.com/Linux/2013-08/88534.htm
Linux下Shell编程——grep命令的基本运用 http://www.linuxidc.com/Linux/2013-06/85525.htm
grep 命令详解及相关事例 http://www.linuxidc.com/Linux/2014-07/104041.htm
Linux基础命令之grep详解 http://www.linuxidc.com/Linux/2013-07/87919.htm
设置grep高亮显示匹配项 http://www.linuxidc.com/Linux/2014-09/106871.htm
Linux grep命令学习与总结 http://www.linuxidc.com/Linux/2014-10/108112.htm
grep用法详解:grep与正则表达式
grep用法详解:grep与正则表达式
首先要记住的是: 正则表达式与通配符不一样,它们表示的含义并不相同!
正则表达式只是一种表示法,只要工具支持这种表示法,那么该工具就可以处理正则表达式的字符串。vi grep ,awk ,sed 等都支持正则表达式.
1基础正则表达式
grep 工具,以前介绍过。
grep -[acinv] '搜索内容串' filename
-a 以文本文件方式搜索
-c 计算找到的符合行的次数
-i 忽略大小写
-n 顺便输出行号
-v 反向选择,即找 没有搜索字符串的行
其中搜索串可以是正则表达式!
1
搜索有the的行,并输出行号
$grep -n 'the' regular_express.txt
搜索没有the的行,并输出行号
$grep -nv 'the' regular_express.txt
2 利用[]搜索集合字符
[] 表示其中的某一个字符 ,例如[ade]
表示a或d或e
woody@xiaoc:~/tmp$ grep -n
't[ae]st' regular_express.txt
8:I can't finish the test.
9:Oh! the soup taste good!
可以用^符号做[]内的前缀,表示除[]内的字符之外的字符。
比如搜索oo前没有g的字符串所在的行. 使用 '[^g]oo' 作搜索字符串
woody@xiaoc:~/tmp$ grep -n '[^g]oo' regular_express.txt
2:apple is my favorite food.
3:Football game is not use feet only.
18:google is the best tools for search keyword.
19:goooooogle yes!
[] 内可以用范围表示,比如[a-z]
表示小写字母,[0-9] 表示0~9的数字, [A-Z] 则是大写字母们。[a-zA-Z0-9]表示所有数字与英文字符。 当然也可以配合^来排除字符。
搜索包含数字的行
woody@xiaoc:~/tmp$ grep -n '[0-9]' regular_express.txt
5:However ,this dress is about $ 3183 dollars.
15:You are the best is menu you are the no.1.
行首与行尾字符 ^ $. ^ 表示行的开头,$表示行的结尾( 不是字符,是位置)那么‘^$’ 就表示空行,因为只有
行首和行尾。
这里^与[]里面使用的^意义不同。它表示^后面的串是在行的开头。
比如搜索the在开头的行
woody@xiaoc:~/tmp$ grep -n '^the' regular_express.txt
12:the symbol '*' is represented as star.
搜索以小写字母开头的行
woody@xiaoc:~/tmp$ grep -n '^[a-z]' regular_express.txt
2:apple is my favorite food.
4:this dress doesn't fit me.
10:motorcycle is cheap than car.
12:the symbol '*' is represented as star.
18:google is the best tools for search keyword.
19:goooooogle yes!
20:go! go! Let's go.
woody@xiaoc:~/tmp$
搜索开头不是英文字母的行
woody@xiaoc:~/tmp$ grep -n '^[^a-zA-Z]'
regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
21:#I am VBird
woody@xiaoc:~/tmp$
$表示它前面的串是在行的结尾,比如 '\.'
表示 . 在一行的结尾
搜索末尾是.的行
woody@xiaoc:~/tmp$ grep -n '\.$'
regular_express.txt //.
是正则表达式的特殊符号,所以要用\转义
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
4:this dress doesn't fit me.
5:However ,this dress is about $ 3183 dollars.
6:GNU is free air not free beer.
.....
注意在MS的系统下生成的文本文件,换行会加上一个 ^M 字符。所以最后的字符会是隐藏的^M ,在处理Windows
下面的文本时要特别注意!
可以用cat dos_file | tr -d '\r' > unix_file 来删除^M符号。 ^M==\r
那么'^$' 就表示只有行首行尾的空行拉!
搜索空行
woody@xiaoc:~/tmp$ grep -n '^$' regular_express.txt
22:
23:
woody@xiaoc:~/tmp$
搜索非空行
woody@xiaoc:~/tmp$ grep -vn '^$'
regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
4:this dress doesn't fit me.
..........
任意一个字符. 与重复字符 *
在bash中*代表通配符,用来代表任意个字符,但是在正则表达式中,他含义不同,*表示有0个或多个 某个字符。
例如 oo*, 表示第一个o一定存在,第二个o可以有一个或多个,也可以没有,因此代表至少一个o.
点. 代表一个任意字符,必须存在。 g??d 可以用 'g..d' 表示。 good ,gxxd ,gabd .....都符合。
woody@xiaoc:~/tmp$ grep -n 'g..d' regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
9:Oh! the soup taste good!
16:The world is the same with 'glad'.
woody@xiaoc:~/tmp$
搜索两个o以上的字符串
woody@xiaoc:~/tmp$ grep -n 'ooo*' regular_express.txt //前两个o一定存在,第三个o可没有,也可有多个。
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
9:Oh! the soup taste good!
18:google is the best tools for search keyword.
19:goooooogle yes!
搜索g开头和结尾,中间是至少一个o的字符串,即gog, goog....gooog...等
woody@xiaoc:~/tmp$ grep -n
'goo*g' regular_express.txt
18:google is the best tools for search keyword.
19:goooooogle yes!
搜索g开头和结尾的字符串在的行
woody@xiaoc:~/tmp$ grep -n 'g.*g' regular_express.txt // .*表示 0个或多个任意字符
1:"Open Source" is a good
mechanism to develop programs.
14:The gd software is a library for drafting programs.
18:google is the best tools for search keyword.
19:goooooogle yes!
20:go! go! Let's go.
限定连续重复字符的范围 { }
. * 只能限制0个或多个, 如果要确切的限制字符重复数量,就用{范围} 。范围是数字用,隔开 2,5 表示2~5个,
2表示2个,2, 表示2到更多个
注意,由于{ }在SHELL中有特殊意义,因此作为正则表达式用的时候要用\转义一下。
搜索包含两个o的字符串的行。
woody@xiaoc:~/tmp$ grep -n 'o\{2\}' regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
9:Oh! the soup taste good!
18:google is the best tools for search keyword.
19:goooooogle yes!
搜索g后面跟2~5个o,后面再跟一个g的字符串的行。
woody@xiaoc:~/tmp$ grep -n
'go\{2,5\}g' regular_express.txt
18:google is the best tools for search keyword.
搜索包含g后面跟2个以上o,后面再跟g的行。。
woody@xiaoc:~/tmp$ grep -n 'go\{2,\}g' regular_express.txt
18:google is the best tools for search keyword.
19:goooooogle yes!
注意,相让[]中的^ - 不表现特殊意义,可以放在[]里面内容的后面。
'[^a-z\.!^ -]' 表示没有小写字母,没有. 没有!, 没有空格,没有- 的 串,注意[]里面有个小空格。
另外shell 里面的反向选择为[!range], 正则里面是 [^range]
2扩展正则表达式
扩展正则表达式是对基础正则表达式添加了几个特殊构成的。
它令某些操作更加方便。
比如我们要去除 空白行和行首为 #的行, 会这样用:
woody@xiaoc:~/tmp$ grep -v '^$' regular_express.txt | grep -v '^#'
"Open Source" is a good mechanism to develop programs.
apple is my favorite food.
Football game is not use feet only.
this dress doesn't fit me.
............
然而使用支持扩展正则表达式的 egrep 与扩展特殊符号 | ,会方便许多。
注意grep只支持基础表达式, 而egrep 支持扩展的,其实 egrep 是 grep -E 的别名而已。因此grep -E 支持扩展正则。
那么:
woody@xiaoc:~/tmp$ egrep -v '^$|^#'
regular_express.txt
"Open Source" is a good mechanism to develop programs.
apple is my favorite food.
Football game is not use feet only.
this dress doesn't fit me.
....................
这里| 表示或的关系。 即满足 ^$ 或者 ^# 的字符串。
这里列出几个扩展特殊符号:
+,于 . * 作用类似,表示 一个或多个重复字符。
?, 于 . * 作用类似,表示0个或一个字符。
|,表示或关系,比如 'gd|good|dog' 表示有gd,good或dog的串
(),将部分内容合成一个单元组。比如 要搜索 glad 或 good 可以这样
'g(la|oo)d'
()的好处是可以对小组使用 + ? *
等。
比如要搜索A和C开头结尾,中间有至少一个(xyz) 的串,可以这样 :
'A(xyz)+C'
◎grep -- print lines matching a pattern (将符合样式的该行列出)
◎语法: grep [options]
PATTERN [FILE...]
grep用以在file内文中比对相对应的部分,或是当没有指定档案时,
由标准输入中去比对。在预设的情况下,grep会将符合样式的那一行列出。
此外,还有两个程式是grep的变化型,egrep及fgrep。
其中egrep就等同於grep -E ,fgrep等同於grep -F 。
◎参数
1. -A NUM,--after-context=NUM
除了列出符合行之外,并且列出後NUM行。
ex: $ grep -A 1 panda file
(从file中搜寻有panda样式的行,并显示该行的後1行)
2. -a或--text
grep原本是搜寻文字档,若拿二进位的档案作为搜寻的目标,
则会显示如下的讯息: Binary file 二进位档名 matches 然後结束。
若加上-a参数则可将二进位档案视为文字档案搜寻,
相当於--binary-files=text这个参数。
ex: (从二进位档案mv中去搜寻panda样式)
(错误!!!)
$ grep panda mv
Binary file mv matches
(这表示此档案有match之处,详见--binary-files=TYPE )
$
(正确!!!)
$ grep -a panda mv
3. -B NUM,--before-context=NUM
与 -A NUM 相对,但这此参数是显示除符合行之外
并显示在它之前的NUM行。
ex: (从file中搜寻有panda样式的行,并显示该行的前1行)
$ grep -B 1 panda file
4. -C [NUM], -NUM, --context[=NUM]
列出符合行之外并列出上下各NUM行,预设值是2。
ex: (列出file中除包含panda样式的行外并列出其上下2行)
(若要改变预设值,直接改变NUM即可)
$ grep -C[NUM] panda file
5. -b, --byte-offset
列出样式之前的内文总共有多少byte ..
ex: $ grep -b panda file
显示结果类似於:
0:panda
66:pandahuang
123:panda03
6. --binary-files=TYPE
此参数TYPE预设为binary(二进位),若以普通方式搜寻,只有2种结果:
1.若有符合的地方:显示Binary file 二进位档名 matches
2.若没有符合的地方:什麽都没有显示。
若TYPE为without-match,遇到此参数,
grep会认为此二进位档案没有包含任何搜寻样式,与-I 参数相同。
若TPYE为text, grep会将此二进位档视为text档案,与-a 参数相同。
Warning: --binary-files=text 若输出为终端机,可能会产生一些不必要的输出。
7. -c, --count
不显示符合样式行,只显示符合的总行数。
若再加上-v,--invert-match,参数显示不符合的总行数。
8. -d ACTION, --directories=ACTION
若输入的档案是一个资料夹,使用ACTION去处理这个资料夹。
预设ACTION是read(读取),也就是说此资料夹会被视为一般的档案;
若ACTION是skip(略过),资料夹会被grep略过:
若ACTION是recurse(递),grep会去读取资料夹下所有的档案,
此相当於-r 参数。
9. -E, --extended-regexp
采用规则表示式去解释样式。
10. -e PATTERN, --regexp=PATTERN
把样式做为一个partern,通常用在避免partern用-开始。
11. -f FILE, --file=FILE
事先将要搜寻的样式写入到一个档案,一行一个样式。
然後采用档案搜寻。
空的档案表示没有要搜寻的样式,因此也就不会有任何符合。
ex: (newfile为搜寻样式档)
$grep -f newfile file
12. -G, --basic-regexp
将样式视为基本的规则表示式解释。(此为预设)
13. -H, --with-filename
在每个符合样式行前加上符合的档案名称,若有路径会显示路径。
ex: (在file与testfile中搜寻panda样式)
$grep -H panda file ./testfile
file:panda
./testfile:panda
$
14. -h, --no-filename
与-H参数相类似,但在输出时不显示路径。
15. --help
产生简短的help讯息。
16. -I
grep会强制认为此二进位档案没有包含任何搜寻样式,
与--binary-files=without-match参数相同。
ex: $ grep -I panda mv
17. -i, --ignore-case
忽略大小写,包含要搜寻的样式及被搜寻的档案。
ex: $ grep -i panda mv
18. -L, --files-without-match
不显示平常一般的输出结果,反而显示出没有符合的档案名称。
19. -l, --files-with-matches
不显示平常一般的输出结果,只显示符合的档案名称。
20. --mmap
如果可能,使用mmap系统呼叫去读取输入,而不是预设的read系统呼叫。
在某些状况,--mmap 能产生较好的效能。然而,--mmap
如果运作中档案缩短,或I/O 错误发生时,
可能造成未定义的行为(包含core dump),。
21. -n, --line-number
在显示行前,标上行号。
ex: $ grep -n panda file
显示结果相似於下:
行号:符合行的内容
22. -q, --quiet, --silent
不显示任何的一般输出。请参阅-s或--no-messages
23. -r, --recursive
递地,读取每个资料夹下的所有档案,此相当於 -d recsuse 参数。
24. -s, --no-messages
不显示关於不存在或无法读取的错误讯息。
小: 不像GNU grep,传统的grep不符合POSIX.2协定,
因为缺乏-q参数,且他的-s 参数表现像GNU grep的 -q 参数。
Shell Script倾向将传统的grep移植,避开-q及-s参数,
且将输出限制到/dev/null。
POSIX: 定义UNIX及UNIX-like系统需要提供的功能。
25. -V, --version
显示出grep的版本号到标准错误。
当您在回报有关grep的bugs时,grep版本号是必须要包含在内的。
26. -v, --invert-match
显示除搜寻样式行之外的全部。
27. -w, --word-regexp
将搜寻样式视为一个字去搜寻,完全符合该"字"的行才会被列出。
28. -x, --line-regexp
grep参数
1. -c 显示匹配的行数(就是显示有多少行匹配了);
2. -n 显示匹配内容所在文档的行号;
3. -i 匹配时忽略大小写;
4. -s 错误信息不输出;
5. -v 输出不匹配内容;
6. -x 输出完全匹配内容;
7. \ 忽略表达式中字符原有含义;
8. ^ 匹配表达式的开始行;
9. $ 匹配表达式的结束行;
10. \< 从匹配表达式的行开始;
11. \> 到匹配表达式的行结束;
12. [ ] 单个字符(如[A] 即A符合要求);
13. [ - ] 范围;如[A-Z]即A,B,C一直到Z都符合要求;
14. . 所有的单个字符;
15. * 所有字符,长度可以为0;
[精华] Grep 用法 |
|
|
|
|
|
|
|
|
何为转义:将特殊符号当普通符号来处理
笔记:
1.^在[]内外的含义
2.何时需要转义
3.*在bash中和正则表达式中本身的区别
4.-acinv
Linux正则表达式grep
正则表达式是一种符号表示法,用于识别文本模式。Linux处理正则表达式的主要程序是grep。grep搜索与正则表达式匹配的行,并将结果输送至标准输出。
1. grep匹配模式
grep按下述方式接受选项和参数(其中,regex表示正则表达式)
1
|
grep [options] regex [files] |
其中options主要为下表:
选项 | 含义 | 功能描述 |
-i | ignore case | 忽略大小写 |
-v | invert match | 不匹配匹配的 |
-l | file-with-match | 输出匹配的文件名 |
-L | file-without-match | 输出不匹配的文件名 |
-c | count | 输出匹配的数目(行数) |
-n | number | 输出匹配行的同时在前面加上文件名及在文件名中的行数 |
-h | no-filename | 抑制文件名的输出 |
举例说明
假设有三个文件del1、del2、del3三个文件的内容如下
例子
2. 特殊字符
符号 | 含义 | 举例 |
^ | 开始标记 | "^abc"满足的例子abc、abcd |
^ | 非(在[]内) | "[^abc]"满足的例子:ddd、mpd |
$ | 结束标记 | ”abc$”满足的例子abc、mmabc |
. | 任意字符 | "a.c"满足的例子abc、fapcc |
\< | 匹配单词开始 | "\<abc"满足的例子abc、abcd |
\> | 匹配单词结束 | "abc\>"满足的例子abc、pmrabc |
| | 或 | "AAA|BBB"满足的例子AAA、BBBpp |
3. 范围
符号 | 含义 | 举例 |
? | 匹配前一个字符0或1次 | "abc?"满足的例子ab、mabcd |
* | 匹配前一个字符≥0次 | "abc*"满足的例子abbb、abcdk |
+ | 匹配前一个字符≥1次 | "abc+"满足的例子abcd、abcccdd |
{} | {m}、{m,n}、{m,}、{,n}分别为匹配前一个字符m次、m到n次、≥m次、≤n次 | "abc\{3,5\}"满足的例子abcccc、abcccccc |
[] | []内如果不是范围,选其一;是范围的话,范围内选其一 | "m[abc]p"满足的例子acpd;m[1-9]p满足的例子m8pp |
() | 将候选的所有元素放在()内,用|隔开 | "a(1|2|3)bc"满足的例子a1bc、mba3bcd |
注意:{}在郑则表达式中需要转移,而{}()不需要。
注意理解{}范围的例子:
4. 标准字符类
字符类 | 释义 |
[:alnum:] | 字母和数字,与[A-Za-z0-9]等价 |
[:word:] | [:alnum:]加上下划线_ |
[:alpa:] | 字母,与[A-Za-z]等价 |
[:digit:] | 数字,与[0-9]等价 |
[:xdigit:] | 十六进制字符,与[0-9A-Fa-f等价] |
[:blank:] | 空格和制表符 |
[:graph:] | 可见字符,靠扩33~126 |
[:lower:] | 小写字母 |
[:upper:] | 大写字母 |
[:print:] | 可打印字符 |
[:space:] | 空白字符,等价于[\t\r\n\v\f] |
[:punct:] | 标点符号 |
[:cntrl:] | ASCII控制码,包括字符0~31以及127 |
例子
可视化正则表达式
工具:Regexper
Shell正则表达式之grep、sed、awk实操笔记
最近一直在研究shell脚本这块,刚好闲下来整了下自己手头上比较好的资料中的一些范例,以下是我整理的鸟哥私房菜里面正则表达式里面比较基础的一些语法详解,适合新手查阅。
首先先复制一段范例:
# vi regular_express.txt
-------------------------------
"Open Source" is a good mechanism to develop programs.
apple is my favorite food.
Football game is not use feet only.
this dress doesn't fit me.
However, this dress is about $ 3183 dollars.
GNU is free air not free beer.
Her hair is very beauty.
I can't finish the test.
Oh! The soup taste good.
motorcycle is cheap than car.
This window is clear.
the symbol '*' is represented as start.
Oh!My god!
The gd software is a library for drafting programs.
You are the best is mean you are the no. 1.
The world <Happy> is the same with "glad".
I like dog.
google is the best tools for search keyword.
goooooogle yes!
go! go! Let's go.
# I am VBird
--------------------------------
设置语系为C
grep
1.搜寻特定字符串"the"
注: n为显示行号
2.反向搜寻特定字符串"the"
3.取得任意大小写"the"的这个字符串
4.利用括号 [] 来搜寻集合字符
搜索test或taste这两个单词时,发现他们有共同的't?st',所以可以这么搜寻
这样其实就是在找t[a]st和t[e]st这两个分开的字符
如果搜索有 oo 的字符时,则可以使用:
如果搜索oo时不想搜到 oo 前面有 g 的话,我们可以利用反向选择[^]来达成:
如果搜索oo前面不想有小写字符,则:
注: 大写英文/小写英文/数字 可以使用 [a-z]/[A-Z]/[0-9]等方式来书写,也可以写在一起
[a-zA-Z0-9]表示要求字符串是数字以及英文
如果我们要取得有数字的那行,则:
注:但考虑到语系对编码顺序的影响,因此除了连续编码使用减号[-]外,也可以用[:lower:]代替a-z 以及 [:digit:] 代替0-9 使用
# grep -n '[[:digit:]]' regular_express.txt
5.显示行首为'the'的字符串
显示行首是小写字符
6.显示行尾为点 . 的那一行
7.显示5-9行数据
8.显示空白行
9.找出g??d字符串,起头g结束d的四个字符串
10. o*代表空字符(就是有没有字符都可以)或者一个到N个o字符,所以grep -n 'o*' regular_express.txt就会把所有行全部打印出来,
11.oo*代表o+空字符或者一个到N个o字符,所以grep -n 'oo*' regular_express.txt就会把o,oo,ooo等的行全部打印出来
12."goo*g"代表gog,goog,gooog...等
13.找出含g...g字符串的行
注: .代表任意字符, .*则就代表空字符或者一个到N个任意字符
14.找出含有数字的行
或# grep -n '[0-9]' regular_express.txt
15.找出含两个o的字符串
注:{}因为在shell里有特殊意义,所以需要加跳脱符\来让其失去意义
找出g后含2到5个o然后以g结尾的字符串
找出g后含2以上的o然后以g结尾的字符串
总结:
^word 表示带搜寻的字符串(word)在行首
word$ 表示带搜寻的字符串(word)在行尾
. 表示1个任意字符
\ 表示转义字符,在特殊字符前加\会将原本的特殊字符意义去除
* 表示重复0到无穷多个前一个RE(正则表达式)字符
[list] 表示搜索含有list的字符串
[n1-n2] 表示搜索指定的字符串范围,例如[0-9] [a-z] [A-Z]等
[^list] 表示反向字符串的范围,例如[0-9]表示非数字字符,[A-Z]表示非大写字符范围
\{n,m\} 表示找出n到m个前一个RE字符
\{n,\} 表示n个以上的前一个RE字符
egrep总结:
+ 表示重复一个或一个以上的前一个RE字符
范例:egrep 'go+d' regular_express.txt
表示搜寻(god)(good)(goood)...等等字符串,o+代表[一个以上的o]
? 表示重复零个或一个的前一个RE字符
范例:egrep 'go?d' regular_express.txt
表示搜寻(gd)(god)字符串,o?代表[空的或1个o]
注:egrep下'go+d'和'go?d'的结果集合就等于grep下的'go*d'
| 表示用或(or)的方式找出数个字符串
范例:egrep 'gd|good|dog' regular_express.txt
表示搜寻(gd)或(god)或(god)字符串,|代表或
() 表示找出群组字符串
范例:egrep 'g(la|oo)d' regular_express.txt
表示搜寻(glad)或(good)字符串
() +表示找出多个重复群组的判别
范例: echo 'AxyzxyzxyzxyzxyzC'|egrep 'A(xyz)+C'
表示搜寻开头是A结尾是C,中间有一个以上的'xyz'字符串
sed:
插入:
1.将/etc/passwd 的内容列出并打印行号,同时,将2-5行删除显示
注: sed是sed -e的简写, 后接单引号
同上删除第2行
同上删除第三行到最后一行
2.在第二行后加上一行test
在第二行前加上一行test
在第二行后加入两行test
> test'
替换行:
3.将2-5行内容取代为 No 2-5 number
4 列出/etc/passwd 内第5-7行
替换字符串:
sed 's/被替换字符串/新字符串/g'
1.获取本机IP的行
将IP前面的部分予以删除
将IP后面的部分删除
-------------------
192.168.100.74
-------------------
2.用grep将关键词MAN所在行取出来
删除批注行
删除空白行
3.利用sed将regular_express.txt内每一行若为.的换成!
注:-i参数会直接修改文本,而并非直接输出
4.利用sed在文本最后一行加入 #This is a test
注: $代表最后一行 a代表行后添加
将selinux配置文件enforcing改成disabled
延伸正规表示法:
延伸写法:
1. +表示重复一个或一个以上的前一个RE字符
例如:egrep -n 'go+d' regular_express.txt
普通写法: grep -n 'goo*d' regular_express.txt
2. ?表示重复零个或一个前一个RE字符
例如: egrep -n 'go?d' regular_express.txt
3. |表示用或的方式找出数个字符串
例如: egrep -n 'gd|good' regular_express.txt
4. ()表示找出群组字符串
例如: egrep -n 'g(la|oo)d' regular_express.txt
也就是搜寻(glad)或good这两个字符串
5. ()+多个重复群组判别
例如: echo 'AxyzxyzxyzxyzC'|egrep 'A(xyz)+C'
也就是要找开头是A结尾是C 中间有一个以上的'xyz'字符串的意思
awk:
1.用last取出登陆数据前五行
取出账号与登陆者IP,且账号与IP之间以TAB隔开
注:$1代表用空格或TAB隔开的第一个字段,以此类推。。
$0代表该行全部字段
注: NF代表每一行的$0的字段总数
NR代表目前awk所处的是第几行数据
FS代表目标分隔符,默认为空格
2.在/etc/passwd中以:来作为分段字符,则我们要查阅第三栏小于10以下的数据,并只列出账号与第三栏
注:查询结果未显示第一行数据,是因为我们虽然定义了FS=":" 但却只能在第二行生效
想读取第一行就需要BEGIN这个关键词:
df:
比较两个文件的差异:
-------------------
Only in /etc/rc3.d/: K30spice-vdagentd
Only in /etc/rc5.d/: S70spice-vdagentd
-------------------
实例:
1。统计TCP连接状态
/^tcp/
过滤出以tcp开头的行,“^”为正则表达式用法,以...开头,这里是过滤出以tcp开头的行。
S[]
定义了一个名叫S的数组,在awk中,数组下标通常从 1 开始,而不是 0。
NF
当前记录里域个数,默认以空格分隔,如上所示的记录,NF域个数等于
$NF
表示一行的最后一个域的值,如上所示的记录,$NF也就是$6,表示第6个字段的值,也就是SYN_RECV或TIME_WAIT等。
S[$NF]
表示数组元素的值,如上所示的记录,就是S[TIME_WAIT]状态的连接数
++S[$NF]
表示把某个数加一,如上所示的记录,就是把S[TIME_WAIT]状态的连接数加一
结果就是显示S数组中最终的数组值
例:S[TIME_WAIT]=最终值 S[TESTABLISHED]=最终值
END
for(key in S)
遍历S[]数组
print key,”\t”,S[key]
打印数组的键和值,中间用\t制表符分割,显示好一些。
2
linux grep 正则表达式
^ 锚定行的开始 如:'^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。
-c 只输出匹配行的个数。
-i 不区分大小写(只适用于单字符)。
-h 查询多文件时不显示文件名。
-l 查询多文件时只输出包含匹配字符的文件名。
-n 显示匹配行及行号。
-s 不显示不存在或无匹配文本的错误信息。
-v 显示不包含匹配文本的所有行。
-V 显示软件版本信息
使用grep匹配时最好用双引号引起来,防止被系统误认为参数或者特殊命令,也可以匹配多个单词。
关于匹配的实例:
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" 查询其他用户和用户组成员有可执行权限的目录集合
首先要记住的是: 正则表达式与通配符不一样,它们表示的含义并不相同!
正则表达式只是一种表示法,只要工具支持这种表示法, 那么该工具就可以处理正则表达式的字符串。vim、grep、awk 、sed 都支持正则表达式,也正是因为由于它们支持正则,才显得它们强大;
1基础正则表达式
grep 工具,以前介绍过。
grep -[acinv] '搜索内容串' filename
-a 以文本文件方式搜索
-c 计算找到的符合行的次数
-i 忽略大小写
-n 顺便输出行号
-v 反向选择,即显示不包含匹配文本的所有行
-h 查询多文件时不显示文件名。
-l 查询多文件时只输出包含匹配字符的文件名。
-s 不显示不存在或无匹配文本的错误信息。
grep命令加- E参数,这一扩展允许使用扩展模式匹配。
其中搜索串可以是正则表达式!
---
先用例子说明问题:
以下为整理的grep 正则表达式的大部分功能,详细参见man
grep: 要用好grep这个工具,其实就是要写好正则表达式,所以这里不对grep的所有功能进行实例讲解,只列几个例子,讲解一个正则表达式的写法。
$ ls -l | grep '^a' 通过管道过滤ls -l输出的内容,只显示以a开头的行。
$ grep 'test' d* 显示所有以d开头的文件中包含test的行。
$ grep 'test' aa bb cc 显示在aa,bb,cc文件中匹配test的行。
$ grep '[a-z]/{5/}' aa 显示所有包含每个字符串至少有5个连续小写字符的字符串的行。
$ grep 'w/(es/)t.*/1' aa 如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.*),这些字符后面紧跟着另外一个es(/1),找到就显示该行。如果用egrep或grep -E,就不用"/"号进行转义,直接写成'w(es)t.*/1'就可以了。
grep正则表达式元字符集(基本集)
^ 锚定行的开始 如:'^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结尾的单词的行。
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的反置形式,匹配一个或多个非单词字符,如点号句号等。
/b 单词锁定符,如: '/bgrep/b'只匹配grep。
关于匹配的实例:
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" 查询其他用户和用户组成员有可执行权限的目录集合
更多的例子:
1
搜索有the的行,并输出行号
$grep -n 'the' regular_express.txt
搜 索没有the的行,并输出行号
$grep -nv 'the' regular_express.txt
2 利 用[]搜索集合字符
[] 表示其中的某一个字符 ,例如[ade] 表示a或d或e
woody@xiaoc:~/tmp$ grep -n 't[ae]st' regular_express.txt
8:I can't finish the test.
9:Oh! the soup taste good!
可以用^符号做[]内的前缀,表示除[]内的字符之外的字 符。
比如搜索oo前没有g的字符串所在的行. 使用 '[^g]oo' 作搜索字符串
woody@xiaoc:~/tmp$ grep -n '[^g]oo' regular_express.txt
2:apple is my favorite food.
3:Football game is not use feet only.
18:google is the best tools for search keyword.
19:goooooogle yes!
[] 内可以用范围表示,比如[a-z] 表示小写字母,[0-9] 表示0~9的数字, [A-Z] 则是大写字母们。[a-zA-Z0-9]表示所有数字与英文字符。 当然也可以配合^来排除字符。
搜索包含数字的行
woody@xiaoc:~/tmp$ grep -n '[0-9]' regular_express.txt
5:However ,this dress is about $ 3183 dollars.
15:You are the best is menu you are the no.1.
行首与行尾字符 ^ $. ^ 表示行的开头,$表示行的结尾( 不是字符,是位置)那么‘^$’ 就表示空行,因为只有
行首和行尾。
这里^与[]里面使用的^意义不同。它表示^后面的串是在行的开头。
比如搜索the在开头的行
woody@xiaoc:~/tmp$ grep -n '^the' regular_express.txt
12:the symbol '*' is represented as star.
搜索以小写字母开头的行
woody@xiaoc:~/tmp$ grep -n '^[a-z]' regular_express.txt
2:apple is my favorite food.
4:this dress doesn't fit me.
10:motorcycle is cheap than car.
12:the symbol '*' is represented as star.
18:google is the best tools for search keyword.
19:goooooogle yes!
20:go! go! Let's go.
woody@xiaoc:~/tmp$
搜索开头不是英文字母的行
woody@xiaoc:~/tmp$ grep -n '^[^a-zA-Z]' regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
21:#I am VBird
woody@xiaoc:~/tmp$
$表示它前面的串是在行的结尾,比如 '/.' 表示 . 在一行的结尾
搜索末尾是.的行
woody@xiaoc:~/tmp$ grep -n '/.$' regular_express.txt //. 是正则表达式的特殊符号,所以要用/转义
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
4:this dress doesn't fit me.
5:However ,this dress is about $ 3183 dollars.
6:GNU is free air not free beer.
.....
注意在MS的系统下生成的文本文件,换行会加上一个 ^M 字符。所以最后的字符会是隐藏的^M ,在处理Windows
下面的文本时要特别注意!
可以用cat dos_file | tr -d '/r' > unix_file 来删除^M符号。 ^M==/r
那么'^$' 就表示只有行首行尾的空行拉!
搜索空行
woody@xiaoc:~/tmp$ grep -n '^$' regular_express.txt
22:
23:
woody@xiaoc:~/tmp$
搜索非空行
woody@xiaoc:~/tmp$ grep -vn '^$' regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
4:this dress doesn't fit me.
grep与正则表达式
http://my.unix-center.net/~Simon_fu/?p=469
虽然正则表达式经常都在用,但是很少能够静下心来仔细的总结一下。最近看了一个台湾人的网站叫做鸟哥Linux私房菜,关于正则表达式的描述挺详细的。在此,我进行一下总结,如果想仔细的学习正则表达式,请访问鸟哥Linux私房菜,台湾同胞的网站是繁体中文的,需要点儿耐心。
正则表达式只是字符串的一种描述,只有和支持正则表达式的工具相结合才能进行字符串处理。本文以grep为例来讲解正则表达式。
grep命令
功能:输入文件的每一行中查找字符串。
基本用法:
–color选项是个非常好的选项,可以让你清楚的明白匹配了那些字符。最好在自己的.bashrc或者.bash_profile文件中加入:
每次grep搜索之后,自动高亮匹配效果了。
‘搜寻字符串’是正则表达式,注意为了避免shell的元字符对正则表达式的影响,请用单引号(’’)括起来,千万不要用双引号括起来("”)或者不括起来。
正则表达式分为基本正则表达式和扩展正则表达式。下面分别简单总结一下。
基本正则表达式
正则表达式学习,主要是对正则表达式元数据的学习。正则表达式本身没有什么高深的东西,本文仅仅对基本正则表达式的元数据进行一下总结:
元数据 |
意义和范例 |
^word | 搜寻以word开头的行。
例如:搜寻以#开头的脚本注释行 grep –n ‘^#’ regular.txt |
word$ | 搜寻以word结束的行
例如,搜寻以‘.’结束的行 grep –n ‘.$’ regular.txt |
. | 匹配任意一个字符。
例如:grep –n ‘e.e’ regular.txt 匹配e和e之间有任意一个字符,可以匹配eee,eae,eve,但是不匹配ee。 |
\ | 转义字符。
例如:搜寻’,’是一个特殊字符,在正则表达式中有特殊含义。必须要先转义。 grep –n ‘\” regular.txt |
* | 前面的字符重复0到多次。
例如匹配gle,gogle,google,gooogle等等 grep –n ‘go*gle’ regular.txt |
[list] | 匹配一系列字符中的一个。
例如:匹配gl,gf。 grep –n ‘g[lf]’ regular.txt |
[n1-n2] | 匹配一个字符范围中的一个字符。
例如:匹配数字字符 grep –n ‘[0-9]’ regular.txt |
[^list] | 匹配字符集以外的字符
例如:grep –n ‘[^o]‘ regular.txt 匹配非o字符 |
\{n1,n2\} | 前面的字符重复n1,n2次
例如:匹配google,gooogle。 grep –n ‘go\{2,3\}gle’ regular.txt |
\<word | 单词是的开头。
例如:匹配以g开头的单词 grep –n ‘\<g’ regular.txt |
word\> | 匹配单词结尾
例如:匹配以tion结尾的单词 grep –n ‘tion\>’ regular.txt |
扩展正则表达式
grep一般情况下支持基本正则表达式,可以通过参数-E支持扩展正则表达式,另外grep单独提供了一个扩展命令叫做egrep用来支持扩展正则表达 式,这条命令和grep -E等价。虽然一般情况下,基本正则表达式就够用了。特殊情况下,复杂的扩展表达式,可以简化字符串的匹配。
扩展正则表达式就是在基本正则表达式的基础上,增加了一些元数据。
元数据 |
意义和范例 |
+ | 重复前面字符1到多次。
例如:匹配god,good,goood等等字符串。 grep –nE go+d’ regular.txt |
? | 匹配0或1次前面的字符
例如,匹配gd,god grep –nE ‘go?d’ regular.txt |
| | 或(or)的方式匹配多个字串 例如:grep –nE ‘god|good’ regular.txt
匹配god或者good。 |
() | 匹配整个括号内的字符串,原来都是匹配单个字符
例如:搜寻good或者glad grep –nE ‘g(oo|la)’ regular.txt |
() | 前面的字符重复0到多次。
例如匹配gle,gogle,google,gooogle等等 grep –nE ‘go*gle’ regular.txt |
Linux下面正则表达式博大精深,上文支持总结了最常用的部分,如果熟练掌握的上面部分的正则表达式基本上可以满足日常使用了。
另外Linux很多命令支持正则表达式,比如find,sed,awk等等。请在使用的时候参照这些命令的手册使用正则表达式。
grep用法详解 grep与正则表达式
正则表达式只是一种表示法,只要工具支持这种表示法, 那么该工具就可以处理正则表达式的字符串。vim、grep、awk 、sed 都支持正则表达式,也正是因为由于它们支持正则,才显得它们强大;在以前上班的公司里,由于公司是基于web的服务型网站(nginx),对正则的需求比 较大,所以也花了点时间研究正则,特与大家分享下:
1基础正则表达式
grep 工具,以前介绍过。
grep -[acinv] '搜索内容串' filename
-a 以文本文件方式搜索
-c 计算找到的符合行的次数
-i 忽略大小写
-n 顺便输出行号
-v 反向选择,即找 没有搜索字符串的行
其中搜索串可以是正则表达式!
1
搜索有the的行,并输出行号
$grep -n 'the' regular_express.txt
搜 索没有the的行,并输出行号
$grep -nv 'the' regular_express.txt
2 利 用[]搜索集合字符
[] 表示其中的某一个字符 ,例如[ade] 表示a或d或e
woody@xiaoc:~/tmp$ grep -n 't[ae]st' regular_express.txt
8:I can't finish the test.
9:Oh! the soup taste good!
可以用^符号做[]内的前缀,表示除[]内的字符之外的字 符。
比如搜索oo前没有g的字符串所在的行. 使用 '[^g]oo' 作搜索字符串
woody@xiaoc:~/tmp$ grep -n '[^g]oo' regular_express.txt
2:apple is my favorite food.
3:Football game is not use feet only.
18:google is the best tools for search keyword.
19:goooooogle yes!
[] 内可以用范围表示,比如[a-z] 表示小写字母,[0-9] 表示0~9的数字, [A-Z] 则是大写字母们。[a-zA-Z0-9]表示所有数字与英文字符。 当然也可以配合^来排除字符。
搜索包含数字的行
woody@xiaoc:~/tmp$ grep -n '[0-9]' regular_express.txt
5:However ,this dress is about $ 3183 dollars.
15:You are the best is menu you are the no.1.
行首与行尾字符 ^ $. ^ 表示行的开头,$表示行的结尾( 不是字符,是位置)那么‘^$' 就表示空行,因为只有
行首和行尾。
这里^与[]里面使用的^意义不同。它表示^后面的串是在行的开头。
比如搜索the在开头的行
woody@xiaoc:~/tmp$ grep -n '^the' regular_express.txt
12:the symbol '*' is represented as star.
搜索以小写字母开头的行
woody@xiaoc:~/tmp$ grep -n '^[a-z]' regular_express.txt
2:apple is my favorite food.
4:this dress doesn't fit me.
10:motorcycle is cheap than car.
12:the symbol '*' is represented as star.
18:google is the best tools for search keyword.
19:goooooogle yes!
20:go! go! Let's go.
woody@xiaoc:~/tmp$
搜索开头不是英文字母的行
woody@xiaoc:~/tmp$ grep -n '^[^a-zA-Z]' regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
21:#I am VBird
woody@xiaoc:~/tmp$
$表示它前面的串是在行的结尾,比如 '\.' 表示 . 在一行的结尾
搜索末尾是.的行
woody@xiaoc:~/tmp$ grep -n '\.$' regular_express.txt //. 是正则表达式的特殊符号,所以要用\转义
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
4:this dress doesn't fit me.
5:However ,this dress is about $ 3183 dollars.
6:GNU is free air not free beer.
.....
注意在MS的系统下生成的文本文件,换行会加上一个 ^M 字符。所以最后的字符会是隐藏的^M ,在处理Windows
下面的文本时要特别注意!
可以用cat dos_file | tr -d '\r' > unix_file 来删除^M符号。 ^M==\r
那么'^$' 就表示只有行首行尾的空行拉!
搜索空行
woody@xiaoc:~/tmp$ grep -n '^$' regular_express.txt
22:
23:
woody@xiaoc:~/tmp$
搜索非空行
woody@xiaoc:~/tmp$ grep -vn '^$' regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
4:this dress doesn't fit me.
..........
任意一个字符. 与重复字符 *
在bash中*代表通配符,用来代表任意个 字符,但是在正则表达式中,他含义不同,*表示有0个或多个 某个字符。
例如 oo*, 表示第一个o一定存在,第二个o可以有一个或多个,也可以没有,因此代表至少一个o.
点. 代表一个任意字符,必须存在。 g??d 可以用 'g..d' 表示。 good ,gxxd ,gabd .....都符合。
woody@xiaoc:~/tmp$ grep -n 'g..d' regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
9:Oh! the soup taste good!
16:The world is the same with 'glad'.
woody@xiaoc:~/tmp$
搜索两个o以上的字符串
woody@xiaoc:~/tmp$ grep -n 'ooo*' regular_express.txt //前两个o一定存在,第三个o可没有,也可有多个。
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
9:Oh! the soup taste good!
18:google is the best tools for search keyword.
19:goooooogle yes!
搜索g开头和结尾,中间是至少一个o的字符串,即gog, goog....gooog...等
woody@xiaoc:~/tmp$ grep -n 'goo*g' regular_express.txt
18:google is the best tools for search keyword.
19:goooooogle yes!
搜索g开头和结尾的字符串在的行
woody@xiaoc:~/tmp$ grep -n 'g.*g' regular_express.txt // .*表示 0个或多个任意字符
1:"Open Source" is a good mechanism to develop programs.
14:The gd software is a library for drafting programs.
18:google is the best tools for search keyword.
19:goooooogle yes!
20:go! go! Let's go.
限定连续重复字符的范围 { }
. * 只能限制0个或多个, 如果要确切的限制字符重复数量,就用{范围} 。范围是数字用,隔开 2,5 表示2~5个,
2表示2个,2, 表示2到更多个
注意,由于{ }在SHELL中有特殊意义,因此作为正则表达式用的时候要用\转义一下。
搜索包含两个o的字符串的行。
woody@xiaoc:~/tmp$ grep -n 'o\{2\}' regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
9:Oh! the soup taste good!
18:google is the best tools for search keyword.
19:goooooogle yes!
搜索g后面跟2~5个o,后面再跟一个g的字符串的行。
woody@xiaoc:~/tmp$ grep -n 'go\{2,5\}g' regular_express.txt
18:google is the best tools for search keyword.
搜索包含g后面跟2个以上o,后面再跟g的行。。
woody@xiaoc:~/tmp$ grep -n 'go\{2,\}g' regular_express.txt
18:google is the best tools for search keyword.
19:goooooogle yes!
注意,相让[]中的^ - 不表现特殊意义,可以放在[]里面内容的后面。
'[^a-z\.!^ -]' 表示没有小写字母,没有. 没有!, 没有空格,没有- 的 串,注意[]里面有个小空格。
另外shell 里面的反向选择为[!range], 正则里面是 [^range]
2扩展正则表达式
扩展正则表达式是对基础正则表达式添加了几个特殊构成的。
它令某些操作更加方便。
比如我们要去除 空白行和行首为 #的行, 会这样用:
woody@xiaoc:~/tmp$ grep -v '^$' regular_express.txt | grep -v '^#'
"Open Source" is a good mechanism to develop programs.
apple is my favorite food.
Football game is not use feet only.
this dress doesn't fit me.
............
然而使用支持扩展正则表达式的 egrep 与扩展特殊符号 | ,会方便许多。
注意grep只支持基础表达式, 而egrep 支持扩展的, 其实 egrep 是 grep -E 的别名而已。因此grep -E 支持扩展正则。
那么:
woody@xiaoc:~/tmp$ egrep -v '^$|^#' regular_express.txt
"Open Source" is a good mechanism to develop programs.
apple is my favorite food.
Football game is not use feet only.
this dress doesn't fit me.
....................
这里| 表示或的关系。 即满足 ^$ 或者 ^# 的字符串。
这里列出几个扩展特殊符号:
+, 于 . * 作用类似,表示 一个或多个重复字符。
?, 于 . * 作用类似,表示0个或一个字符。
|,表示或关系,比如 'gd|good|dog' 表示有gd,good或dog的串
(),将部分内容合成一个单元组。 比如 要搜索 glad 或 good 可以这样 'g(la|oo)d'
()的好处是可以对小组使用 + ? * 等。
比如要搜索A和C开头结尾,中间有至少一个(xyz) 的串,可以这样 : 'A(xyz)+C'