grep -io "http:/=[A-Z0-9]\{16\}" ./wsxf.txt >wsxf_urls.txt
首先要记住的是: 正则表达式与通配符不同,它们表示的含义并不相同!
正则表达式只是一种表示法,只要工具支持这种表示法, 那么该工具就能够处理正则表达式的字符串。vim、grep、awk 、sed 都支持正则表达式,也正是由于因为它们支持正则,才显得它们强大;
1基础正则表达式
grep 工具,之前介绍过。
grep -[acinv] '搜索内容串' filename
-a 以文本文件方式搜索
-c 计算找到的符合行的次数
-i 忽略大小写
-n 顺便输出行号
-v 反向选择,即显示不包含匹配文本的全部行php
-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”,第2、3、四是任意字符,第五个字符是“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.css
1.命令功能:html
grep命令用来在文本文件中查找指定模式的词或短语,并在标准输出上显示包括给定字符串模式的全部行;java
egrep命令等同于grep -E,可使用扩展的字符串模式进行搜索;mysql
fgrep命令等同于grep -F,是快速搜索命令,它检索固定字符串,但不识别正则表达式。linux
2.通常格式:nginx
grep [选项] [查找模式] [文件名1,文件名2,……]git
fgrep [选项] [查找模式] [文件名1,文件名2,……]web
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会搜索全部文件,包括隐藏文件夹下的文件。
例如,使用以下命令搜索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的一个选项参数了。
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 命令 用法大全 一、参数: -I :忽略大小写 -c :打印匹配的行数 -l :从多个文件中查找包含匹配项 -v :查找不包含匹配项的行 -n:打印包含匹配项的行和行标
二、RE(正则表达式) \ 忽略正则表达式中特殊字符的原有含义 ^ 匹配正则表达式的开始行 $ 匹配正则表达式的结束行 \< 从匹配正则表达式的行开始 \> 到匹配正则表达式的行结束 [ ] 单个字符;如[A] 即A符合要求 [ - ] 范围 ;如[A-Z]即A,B,C一直到Z都符合要求 . 全部的单个字符 * 全部字符,长度能够为0
三、举例 # 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
一、筛选一个或一个以上前面的字符 字符后面使用+
[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
二、筛选零个或一个前面的字符 字符后面使用?
[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
三、筛选字符串1或字符串2 包含里面任意一个字符串的打印出来
[root@ linuxidc.com ~]# egrep 'aaa|111|ooo' test.txt
rooooot:x:0:0/roooooot:/bin/bash
11111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
四、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
五、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
1、 正则表达式:
正则表达式(或称Regular Expression,简称RE)就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。
该模式描述在查找文字主体时待匹配的一个或多个字符串。
正则表达式做为一个模板,将某个字符模式与所搜索的字符串进行匹配。简单的说,正则表示式就是处理字符串的方法,它是以行为单位来进行字符串的处理行为, 正则表示式经过一些特殊符号的辅助,可让使用者轻易的达到搜寻/删除/取代某特定字符串的处理程序。vim、grep、find、awk、sed等命令都支持正则表达式。
经常使用正则表达式:
1、.表明任意单个字符,如:/l..e/与包含一个l,后跟两个字符,而后跟一个e的行相匹配
grep ‘l..e’ test
awk ‘/l..e/’ test
cat test(查看文件)
leeet
laat
lae
2、^表明行的开始。 ^love 如:与全部love开头的行匹配
grep ^le test
3、$表明行的结束。love$ 如:与全部love结尾的行匹配
那么‘^$’ 就表示空行
grep at$ test
4、[…]匹配括号中的字符之一
[abc] 匹配单个字符a或b或c
[123] 匹配单个字符1或2或3
[a-z] 匹配小写字母a-z之一
[a-zA-Z] 匹配任意英文字母之一
[0-9a-zA-Z]匹配任意英文字母或数字之一
注意:上面标红色的单个和之一,无论[]里面多复杂,它的结果都是一个字符!
grep ‘l[ae]e’ test
awk‘/l[ae]e/’ test
能够用^标记作[]内的前缀,表示除[]内的字符以外的字符。好比 搜索oo前没有g的字符串的行. 应用 '[^g]oo'做搜索字符串,^符号若是出现在[]的起始位置表示否认,可是在[]的其余位置是普通字符。[^9b^c] 匹配b或^或c或不是a的任意单个字符
5、* 用于修饰前导字符,表示前导字符出现0次或任意多次
如:'a*grep'匹配全部0个或多个a后紧跟grep的行。“.*”表示任意字符串
6、\?用于修饰前导字符,表示前导字符出现0或1次
a\? 匹配0或1个a
7、\+用于修饰前导字符,表示前导字符出现1或多次
a\+ 匹配1或多个a
8、\{n,m\} 用于修饰前导字符,表示前导字符出现n至m次(n和m都是整数,且n<m)
a\{3,5\} 匹配3至5个连续的a
\{n,m\}还有其余几种形式:
\{n\} 连续的n个前导字符
\{n,\} 连续的至少n个前导字符
9、\ 用于转义紧跟其后的单个特殊字符,使该特殊字符成为普通字符
如:^\.[0-9][0-9] 对以一个句点和两个数字开始
例如:
a* 匹配连续的任意(也包括0)个a
a\? 匹配0或1个a
a\+ 匹配1或多个a
a\{3,5\} 匹配3至5个连续的a
\.* 匹配0或多个连续的. \.表示普通字符句点
sed ‘s/^ *[0-9]*//’ test1
history > test1(先生成test1文件)
10、|表示或 如:a|b|c 匹配a或b或c。如:grep|sed匹配grep或sed
如:egrep ‘grep|sed’ test
11、(),将部份内容合成一个单位组,好比要搜索 glad 或 good能够以下 'g(la|oo)d'
如:egrep ‘g(la|oo)d’ test
综合举例1:
1 Christian Scott lives here and will put ona Christmas party.
2 There are around 30 to 35 people invited.
3 They are:
4 Tom
5 Dan
6 Rhonda Savage
7 Nicky and Kimerly.
8 Steve, Suzanne, Ginger and Larry.
^[A-Z]..$
搜索行以A至Z的一个字母开头,而后跟两个任意字母,而后跟一个换行符的行。将找到第5行。
^[A-Z][a-z]*3[0-5]
搜索以一个大写字母开头,后跟0个或多个小写字母,再跟数字3,再跟0—5之间的一个数字。没法找到匹配行(改为^[A-Z][a-z]*.*3[0-5]可找到第2行)
^ *[A-Z][a-z][a-z]$
搜索以0个或多个空格开头,跟一个大写字母,两个小写字母和一个换车符。将找到第4行的TOM(整行匹配)和第5行。注意,*前面有一个空格。
综合举例2:
# ls -l /bin | grep '^...s'
上面的命令是用来查找suid文件的;
# ls -lR /usr |grep '^...s..s'
上面的命令是用来查找suid和guid的。
2、grep命令的用法
grep (global search regularexpression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来.
参数:
1. -A NUM,--after-context=NUM 除了列出符合行以外,而且列出后NUM行。
如: $ grep –A 1 panda file (从file中搜寻有panda样式的行,并显示该行的后1行)
2. -B NUM,--before-context=NUM 与 -A NUM 相对,但这此参数是显示除符合行以外并显示在它以前的NUM行。如: (从file中搜寻有panda样式的行,并显示该行的前1行)
$ grep -B 1 panda file
3、 -C [NUM], -NUM, --context[=NUM] 列出符合行以外并列出上下各NUM行,默认值是2。
如: (列出file中除包含panda样式的行外并列出其上下2行)(若要改变默认值,直接改变NUM便可)
$ grep -C[NUM] panda file
4、 -c, --count 不显示符合样式行,只显示符合的总行数。若再加上-v,--invert-match,参数显示不符合的总行数
5、-i,--ignore-case 忽略大小写差异
6、-n,--line-number 在匹配的行前面打印行号
7、-v,--revert-match 反检索,只显示不匹配的行
8、精确匹配:
例如在抽取字符串“ 48”,返回结果包含诸如484和483等包含“48”的其余字符串,实际上应精确抽取只包含48的各行。
使用grep抽取精确匹配的一种有效方式是在抽取字符串前加\<,在抽取字符串后加\>。假定如今精确抽取48,
方法以下:
#grep '\<48\>' filename
9、-s 不显示不存在或无匹配文本的错误信息
如:执行命令grep "root" /etc/password,由于password文件不存在,因此在屏幕上输出错误信息,若使用grep命令-s开关,可屏蔽错误信息
要用好grep这个工具,其实就是要写好正则表达式,因此这里不对grep的全部功能进行实例讲解,只列几个例子,讲解一个正则表达式的写法。
$ ls -l | grep '^d'
经过管道过滤ls-l输出的内容,只显示以d开头的行。
$ grep 'test' d*
显示全部以d开头的文件中包含test的行。
$ grep 'test' aa bb cc
显示在aa,bb,cc文件中匹配test的行。
$ grep '[a-z]\{5,\}' aa
显示全部包含每一个字符串至少有5个连续小写字符的字符串的行。
$grep ‘t[a|e]st’ filename
显示包含test或tast的全部行。
$grep '\.$' filename
显示以.为结尾的全部行。
3、sed命令的用法
sed是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并无改变,除非你使用重定向存储输出。
sed的基本命令:
1.替换: s命令
1.1 基本用法
如: sed 's/day/night/' <old >new
该例子将文件 old 中的每一行第一次出现的 day 替换成 night, 将结果输出到文件 new
s " 替换 " 命令
/../../ 分割符 (Delimiter)
day 搜索字符串
night 替换字符串
其实 , 分割符 "/" 能够用别的符号代替 , 好比 ",","|" 等 .
如:sed's/\/usr\/local\/bin/\/common\/bin/'<old >new
等价于 sed's_/usr/local/bin_/common/bin_' <old >new
显然 , 此时用 "_" 做分割符比 "/" 好得多
sed -i 's/anonymous=YES/anonymous=NO/' /etc/vsftpd/vsftpd.conf
1.2 用 & 表示匹配的字符串
有时可能会想在匹配到的字符串周围或附近加上一些字符 .
如: sed 's/abc/(abc)/' <old >new
该例子在找到的 abc 先后加上括号 .
该例子还能够写成 sed 's/abc/(&)/' <old >new
下面是更复杂的例子 :
sed 's/[a-z]*/(&)/' <old >new
sed 默认只替换搜索字符串的第一次出现 , 利用 /g 能够替换搜索字符串全部
$ sed's/test/mytest/g' example-----在整行范围内把test替换为mytest。若是没有g标记,则只有每行第一个匹配的test被替换成mytest。
$ sed's/^192.168.0.1/&localhost/' example-----&符号表示替换字符串中被找到的部份。全部以192.168.0.1开头的行都会被替换成它自已加 localhost,变成192.168.0.1localhost。
$ sed's#10#100#g' example-----不论什么字符,紧跟着s命令的都被认为是新的分隔符,因此,“#”在这里是分隔符,代替了默认的“/”分隔符。表示把全部10替换成100。
若是须要对同一文件或行做屡次修改,可使用 "-e" 选项

取得eth0网卡IP地址:

2.删除行:d命令
从某文件中删除包含 "how" 的全部行

将/etc/passwd的内容显示并找印行号,同时将2~5删除

附:nl命令在linux系统中用来计算文件中行号。nl 能够将输出的文件内容自动的加上行号
若是只要删除第2行,可使用nl /etc/passwd | sed '2d' 来达成,至于如果要删除第 3 到最后一行,则是nl /etc/passwd | sed '3,$d'的啦。
3.增长行:a命令(在指定的行后新增)或i命令(在指定的行前新增)
a的后面能够接字符串,而这些字符串会在新的一行出现
在/etc/passwd的第二行后增长“XXXXX”字样的新行

在/etc/passwd的第二行前增长“XXXXX”字样的新行

若是要同时新增多行,则每行之间要用反斜杠\来进行新行的添加

sed -i '/\[global\]/a test' /etc/samba/smb.conf
sed -i '57a test' /etc/samba/smb.conf
4、取代行:c命令
c的后面能够接字符串,这些字符串能够取代n1,n2之间的行

5、打印:p命令
sed '/north/p' datafile 默认输出全部行,找到north的行重复打印
sed –n '/north/p' datafile 禁止默认输出,只打印找到north的行
nl /etc/passwd | sed -n '5,7p' 仅列出/etc/passwd文件中的第5~7行内容
注:sed 的-i选项能够直接修改文件中的内容

4、awk命令:
awk也是一个数据处理工具!相较于 sed 经常做用于一整个行的处理, awk 则比较倾向于一行当中分红数个字段来处理。
.awk语言的最基本功能是在文件或字符串中基于指定规则来分解抽取信息,也能够基于指定的规则来输出数据。
1.命令格式
awk [-F field-separator] 'commands' input-files
其中,[-F域分隔符]是可选的,由于awk使用空格或tab键做为缺省的域分隔符,所以若是要浏览域间有空格的文本,没必要指定这个选项,若是要浏览诸如passwd文件,此文件各域以冒号做为分隔符,则必须指明-F选项,如:awk -F: 'commands' input-file。
awk的模式和动做
任何awk语句都由模式和动做组成(awk_pattern { actions })。
在一个awk脚本中可能有许多语句。
模式部分决定动做语句什么时候触发及触发事件。处理即对数据进行的操做。若是省略模式部分,动做将时刻保持执行状态。即省略时不对输入记录进行匹配比较就执行相应的actions。
模式能够是任何条件语句或正则表达式等。awk_pattern能够是如下几种类型:
1) 正则表达式用做awk_pattern: /regexp/
例如:awk '/ ^[a-z]/' input_file
2) 布尔表达式用做awk_pattern,表达式成立时,触发相应的actions执行。
① 表达式中可使用变量(如字段变量$1,$2等)和/regexp/
② 布尔表达式中的操做符:
关系操做符: < > <= >= == !=
匹配操做符: value ~ /regexp/ 若是value匹配/regexp/,则返回真
value !~ /regexp/ 若是value不匹配/regexp/,则返回真
例如: awk '$2 > 10 {print"ok"}' input_file
awk '$3 ~ /^d/ {print"ok"}' input_file
③ &&(与)和 ||(或) 能够链接两个/regexp/或者布尔表达式,构成混合表达式。!(非) 能够用于布尔表达式或者/regexp/以前。
例如: awk '($1 < 10 ) && ($2> 10) {print "ok"}' input_file
awk '/^d/ || /x$/ {print"ok"}' input_file
模式包括两个特殊字段 BEGIN和END。使用BEGIN语句设置计数和打印头。BEGIN语句使用在任何文本浏览动做以前,以后文本浏览动做依据输入文本开始执行。END语句用来在awk完成文本浏览动做后打印输出文本总数和结尾状态标志。
实际动做在大括号{ }内指明。动做大多数用来打印,可是还有些更长的代码诸如i f和循环语句及循环退出结构。若是不指明采起动做,awk将打印出全部浏览出来的记录。
awk执行时,其浏览域标记为$1,$2...$n。这种方法称为域标识。使用这些域标识将更容易对域进行进一步处理。
使用$1 , $3表示参照第1和第3域,注意这里用逗号作域分隔。若是但愿打印一个有5个域
的记录的全部域,没必要指明$1 ,$2 , $3 , $4 , $5,可以使用$0,意即全部域。
为打印一个域或全部域,使用print命令。这是一个awk动做
awk的运行过程:
① 若是BEGIN区块存在,awk执行它指定的actions。
② awk从输入文件中读取一行,称为一条输入记录。(若是输入文件省略,将从标准输入读取)
③ awk将读入的记录分割成字段,将第1个字段放入变量$1中,第2个字段放入$2,以此类推。$0表示整条记录。
④ 把当前输入记录依次与每个awk_cmd中awk_pattern比较,看是否匹配,若是相匹配,就执行对应的actions。若是不匹配,就跳过对应的actions,直到比较完全部的awk_cmd。
⑤ 当一条输入记录比较了全部的awk_cmd后,awk读取输入的下一行,继续重复步骤③和④,这个过程一直持续,直到awk读取到文件尾。
⑥ 当awk读完全部的输入行后,若是存在END,就执行相应的actions。
入门实例:
例1:显示/etc/passwd文件中的用户名和登陆shell

若是只是显示/etc/passwd的帐户和帐户对应的shell,而帐户与shell之间以tab键分割

若是只是显示/etc/passwd文件中的用户名和登陆shell, 而帐户与shell之间以逗号分割

注:awk的老是输出到标准输出,若是想让awk输出到文件,可使用重定向。
例2:显示/etc/passwd文件中的UID大于500的全部用户的用户名和登陆shell

例3:若是只是显示/etc/passwd文件中的UID大于500的用户名和登陆shell,而帐户与shell之间以逗号分割,并且在全部行添加列名name,shell,在最后一行添加"blue,/bin/nosh"。

注:
1.awk 后面接两个单引号并加上大括号 {} 来设定想要对数据进行的处理动做
2.awk工做流程是这样的:先执行BEGING,而后读取文件,读入有\n换行符分割的一条记录,而后将记录按指定的域分隔符划分域,填充域,$0则表示全部域,$1表示第一个域,$n表示第n个域,随后开始执行模式所对应的动做。接着开始读入第二条记录······直到全部的记录都读完,最后执行END操做。
思考题:如何打印全部记录(以/etc/passwd中的内容为例)

例4:搜索/etc/passwd有root关键字的全部行
这种是pattern(模式)的使用示例,匹配了pattern(这里是root)的行才会执行action(没有指定action,默认输出每行的内容)。
搜索支持正则表达式,例如找root开头的:

搜索/etc/passwd有root关键字的全部行,并显示对应的shell

这里指定了action是{print $7}
分类: shell 2014-06-24 11:27 1876人阅读
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 用法 |
|
|
|
Grep : g (globally) search for a re (regular expression ) and p (print ) the results. 1、参数: -I :忽略大小写 -c :打印匹配的行数 -l :从多个文件中查找包含匹配项 -v :查找不包含匹配项的行 -n:打印包含匹配项的行和行标 二、RE(正则表达式) \ 忽略正则表达式中特殊字符的原有含义 ^ 匹配正则表达式的开始行 $ 匹配正则表达式的结束行 \< 从匹配正则表达式的行开始 \>; 到匹配正则表达式的行结束 [ ] 单个字符;如[A] 即A符合要求 [ - ] 范围 ;如[A-Z]即A,B,C一直到Z都符合要求 . 全部的单个字符 * 全部字符,长度能够为0 三、举例 # 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 '' 单个字符;如[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 The end |
|
何为转义:将特殊符号当普通符号来处理
笔记:
1.^在[]内外的含义
2.什么时候须要转义
3.*在bash中和正则表达式中自己的区别
4.-acinv
正则表达式是一种符号表示法,用于识别文本模式。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 |
抑制文件名的输出 |
举例说明
假设有三个文件del一、del二、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实操笔记
投稿:junjie 字体:[
增长
减少] 类型:转载 时间:2014-09-10
这篇文章主要介绍了Shell正则表达式之grep、sed、awk实操笔记,本文使用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
复制代码 代码以下:
#export LANG=C
grep
1.搜寻特定字符串"the"
注: n为显示行号
复制代码 代码以下:
# grep -n 'the' regular_express.txt
2.反向搜寻特定字符串"the"
复制代码 代码以下:
# grep -vn 'the' regular_express.txt
3.取得任意大小写"the"的这个字符串
复制代码 代码以下:
# grep -in 'the' regular_express.txt
4.利用括号 [] 来搜寻集合字符
搜索test或taste这两个单词时,发现他们有共同的't?st',因此能够这么搜寻
复制代码 代码以下:
# grep -n 't[ae]st' regular_express.txt
这样其实就是在找t[a]st和t[e]st这两个分开的字符
若是搜索有 oo 的字符时,则可使用:
复制代码 代码以下:
# grep -n 'oo' regular_express.txt
若是搜索oo时不想搜到 oo 前面有 g 的话,咱们能够利用反向选择[^]来达成:
复制代码 代码以下:
# grep -n '[^g]oo' regular_express.txt
若是搜索oo前面不想有小写字符,则:
复制代码 代码以下:
# grep -n '[^a-z]oo' regular_express.txt
注: 大写英文/小写英文/数字 可使用 [a-z]/[A-Z]/[0-9]等方式来书写,也能够写在一块儿
[a-zA-Z0-9]表示要求字符串是数字以及英文
若是咱们要取得有数字的那行,则:
复制代码 代码以下:
# grep -n '[0-9]' regular_express.txt
注:但考虑到语系对编码顺序的影响,所以除了连续编码使用减号[-]外,也能够用[:lower:]代替a-z 以及 [:digit:] 代替0-9 使用
复制代码 代码以下:
# grep -n '[^[:lower:]]oo' regular_express.txt
# grep -n '[[:digit:]]' regular_express.txt
5.显示行首为'the'的字符串
复制代码 代码以下:
# grep -n '^the' regular_express.txt
显示行首是小写字符
复制代码 代码以下:
# grep -n '^[a-z]' regular_express.txt
6.显示行尾为点 . 的那一行
复制代码 代码以下:
# grep -n '\.$' regular_express.txt
7.显示5-9行数据
复制代码 代码以下:
# cat -An regular_express.txt |head -n 10 |tail -n 6
8.显示空白行
复制代码 代码以下:
# grep -n '^$' regular_express.txt
9.找出g??d字符串,起头g结束d的四个字符串
复制代码 代码以下:
# grep -n 'g..d' regular_express.txt
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...等
复制代码 代码以下:
# grep -n 'goo*g' regular_express.txt
13.找出含g...g字符串的行
注: .表明任意字符, .*则就表明空字符或者一个到N个任意字符
复制代码 代码以下:
# grep -n 'g.*g' regular_express.txt
14.找出含有数字的行
复制代码 代码以下:
# grep -n '[0-9][0-9]*' regular_express.txt
或# grep -n '[0-9]' regular_express.txt
15.找出含两个o的字符串
注:{}由于在shell里有特殊意义,因此须要加跳脱符\来让其失去意义
复制代码 代码以下:
# grep -n 'o\{2\}' regular_express.txt
找出g后含2到5个o而后以g结尾的字符串
复制代码 代码以下:
# grep -n 'go\{2,5\}g' regular_express.txt
找出g后含2以上的o而后以g结尾的字符串
复制代码 代码以下:
# grep -n 'go\{2,\}g' regular_express.txt
总结:
^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行删除显示
复制代码 代码以下:
# nl /etc/passwd | sed '2,5d'
注: sed是sed -e的简写, 后接单引号
同上删除第2行
复制代码 代码以下:
# nl /etc/passwd | sed '2d'
同上删除第三行到最后一行
复制代码 代码以下:
# nl /etc/passwd | sed '3,$d'
2.在第二行后加上一行test
复制代码 代码以下:
# nl /etc/passwd | sed '2a test'
在第二行前加上一行test
复制代码 代码以下:
# nl /etc/passwd | sed '2i test'
在第二行后加入两行test
复制代码 代码以下:
# nl /etc/passwd | sed '2a test \
> test'
替换行:
3.将2-5行内容取代为 No 2-5 number
复制代码 代码以下:
# nl /etc/passwd | sed '2,5c No 2-5 number'
4 列出/etc/passwd 内第5-7行
复制代码 代码以下:
# nl /etc/passwd |sed -n '5,7p'
替换字符串:
sed 's/被替换字符串/新字符串/g'
1.获取本机IP的行
复制代码 代码以下:
# /sbin/ifconfig eth0 |grep 'inet addr'
将IP前面的部分予以删除
复制代码 代码以下:
# /sbin/ifconfig eth0 |grep 'inet addr'| sed 's/^.*addr://g'
将IP后面的部分删除
复制代码 代码以下:
# /sbin/ifconfig eth0 |grep 'inet addr'| sed 's/^.*addr://g'| sed 's/Bcast:.*$//g'
-------------------
192.168.100.74
-------------------
2.用grep将关键词MAN所在行取出来
复制代码 代码以下:
# cat /etc/man.config |grep 'MAN'
删除批注行
复制代码 代码以下:
# cat /etc/man.config |grep 'MAN'| sed 's/^#.*$//g'
删除空白行
复制代码 代码以下:
# cat /etc/man.config |grep 'MAN'| sed 's/^#.*$//g'| sed '/^$/d'
3.利用sed将regular_express.txt内每一行若为.的换成!
注:-i参数会直接修改文本,而并不是直接输出
复制代码 代码以下:
# sed -i 's/.*\.$/\!/g' regular_express.txt
4.利用sed在文本最后一行加入 #This is a test
注: $表明最后一行 a表明行后添加
复制代码 代码以下:
# sed -i '$a #This is a test' regular_express.txt
将selinux配置文件enforcing改为disabled
复制代码 代码以下:
# sed -i '6,6c SELINUX=disabled' /etc/selinux/config
延伸正规表示法:
复制代码 代码以下:
# grep -v '^$' regular_express.txt |grep -v '^#'
延伸写法:
复制代码 代码以下:
# egrep -v '^$'|'^#' regular_express.txt
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取出登录数据前五行
复制代码 代码以下:
# last -n 5
取出帐号与登录者IP,且帐号与IP之间以TAB隔开
复制代码 代码以下:
# last -n 5 |awk '{print $1 "\t" $3}'
注:$1表明用空格或TAB隔开的第一个字段,以此类推。。
$0表明该行所有字段
复制代码 代码以下:
# last -n 5 |awk '{print $1 "\t lines:" NR "\t columes:" NF}'
注: NF表明每一行的$0的字段总数
NR表明目前awk所处的是第几行数据
FS表明目标分隔符,默认为空格
2.在/etc/passwd中以:来做为分段字符,则咱们要查阅第三栏小于10如下的数据,并只列出帐号与第三栏
复制代码 代码以下:
# cat /etc/passwd | awk '{FS=":"} $3<10 {print $1 "\t \t"$3}'
注:查询结果未显示第一行数据,是由于咱们虽然定义了FS=":" 但却只能在第二行生效
想读取第一行就须要BEGIN这个关键词:
复制代码 代码以下:
# cat /etc/passwd | awk 'BEGIN {FS=":"} $3<10 {print $1 "\t \t"$3}'
df:
比较两个文件的差别:
复制代码 代码以下:
# diff /etc/rc3.d/ /etc/rc5.d/
-------------------
Only in /etc/rc3.d/: K30spice-vdagentd
Only in /etc/rc5.d/: S70spice-vdagentd
-------------------
实例:
1。统计TCP链接状态
复制代码 代码以下:
# netstat -na | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
/^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制表符分割,显示好一些。
grep基本命令与正则表达式
(2011-08-14 14:55:08)
grep 命令是支持正则表达式的一个多用途文本搜索工具,他的通常格式为:
grep [选项] [模式] [文件...]
grep命令的选项用于对搜索过程进行补充说明。grep命令的模式十分灵活,能够是字符串、变量,还能够是正则表达式。
不管模式是何种形式,只要模式中包含了空格,就须要使用双引号或单引号将模式引发来。
下面具体说明grep选项的含义和用法。
一、-c选项: -c选项表示输出匹配字符串行的数量。
例子:#输出文件00.pem中包含jk的行的数量
二、-n选项:列出全部的匹配行,并输出行号。
例子:#输出文件00.pem中包含jk行的行号和行。
$ grep -n jk 00.pem
1:jkfrdjkfdkl
2:dkjfkjkjelkrge
4:frjkj-----------kltijkert
9:fjkdkle;roitoer
13:djkfthe the23
14:the jejk ekj44
$
三、-选项: 显示不包含模式的全部行。
例子:#输出文件00.pem中不包含jk的行的数量
$ grep -vc jk 00.pem
12
$
四、-i选项: 表示grep命令不区分大小写。
例子:#输出文件00.pem中包含 jk(不论大小写)的行
$ grep -i jk 00.pem
Jkfrdjkfdkl
dkjfkjkjelkrge
frjkj-----------kltijkert
fJKdkle;roitoer
djkfthe the23
the jejk ekj44
$
五、-h选项: 表示查询多文件时不显示文件名。
六、-l选项: 表示只列出符合匹配的文件名,而不列出具体匹配行。
七、-s选项: 表示不显示不存在或无匹配文本的错误信息。
例1:#未使用-s选项,打印错误信息
$ grep jk dk 00.pem
grep: dk: 没有那个文件或目录
00.pem:Jkfrdjkfdkl
00.pem:dkjfkjkjelkrge
00.pem:frjkj-----------kltijkert
00.pem:the jejk ekj44
例2:#使用-s选项后,不打印错误信息
$ grep -s jk dk 00.pem
00.pem:Jkfrdjkfdkl
00.pem:dkjfkjkjelkrge
00.pem:frjkj-----------kltijkert
00.pem:the jejk ekj44
$
八、-r选项: 表示递归搜索,不只搜索当前目录,并且搜索子目录。
九、-w和-x选项:
-w选项表示匹配整词,即以模式的字面意思去解析它。
-x选项是匹配整行,即只有当文件中有整行内容与模式匹配时,grep命令才输出改行结果。
例:说明grep命令的-w和-x选项的区别
$ cat world.txt
Hello World
World
World Cup
African
One One World
$
#搜索包含单词“World”的文本行
$ grep -w 'World' world.txt
Hello World
World
World Cup
One One World
$
#搜索整行文本是单词“World”的行
$ grep -x 'World' world.txt
World
&
十、-q选项: 表示grep将再也不输出任何结果,而是以退出状态表示搜索是否成功。
0表示成功,1表示未搜索到知足模式的文本行,2表示命令或程序因为错误而未能执行。
例1:grep命令搜索成功
$ grep -q -x 'World' world.txt
$ echo $?
0
$
例2:grep命令未搜索到知足模式的文本行
$ grep -q -x 'World African' world.txt
$ echo $?
1
$
例3:grep命令执行失败
$ grep -q -x 'World African' world
grep : world : 没有那个文件或目录
$ echo $?
2
$
十一、-b和-o选项:
grep -b选项打印匹配行距文件头部的偏移量,以字节为单位。
若是在-b选项后面再加上-o选项,grep命令将打印匹配的词距文件头部的偏移量。
例1:#第一条命令:打印匹配行距文件头部的偏移量
$ grep -b -w 'World' world.txt
0:Hello World
12:World
18:World Cup
36:One One World
$
例2:#第一条命令:打印匹配词距文件头部的偏移量
$ grep -b -o -w 'World' world.txt
6:World
12:World
18:World
44:World
$
下面介绍一下grep和正则表达式结合使用的例子。
一、匹配行首:
元字符“^”表示行首,若是须要匹配.pem为后缀的文件中以橫杠“-”开头的行,可输入以下命令:
$ grep ^- *.pem
二、设置大小写:
利用-i符号可使grep命令不区分大小写,[ ]符号也能够实现这一功能。
例如:
$ grep -n [Jj][Kk] 00.pem
Jkfrdjkfdkl
dkjfkjkjelkrge
frjkj-----------kltijkert
fJKdkle;roitoer
the jejk ekj44
$
三、匹配重复字符:
能够用“.”符号和“*”符号来实现。
例1:grep和.符号
#表示搜索00.pem文件中以/字符开始、中间4个任意字符、第6个字符仍为/的行。
$ grep ^/..../ 00.pem
/home/globus/fff.pem
例2:grep和*符号
#表示搜索00.pem文件中以“-”开头,重复“-”符号任意次,而后是B字符的行。
$ grep ^-*B 00.pem
----------Bkjfkerj
$
四、转移符:
若是匹配的目标字符串包含的元字符,则须要用转义符“\”屏蔽其意义。
例: #搜索“-”符号重复5次的文本行。
$ grep '\-\{5\}' 00.pem
----------Bkjfkerj
frjkj----------Bkltijkert
riuitieoe---erj-----rg
$
五、POSIX字符类:
类名 意义
[:upper:] 表示大写字母[A-Z]
[:lower:] 表示小写字母[a-z]
[:digit:] 表示阿拉伯数字[0-9]
[:alnum:] 表示大小写字母和阿拉伯数字[0-9 a-z A-Z]
[:space:] 表示空格或Tab键
[:alpha:] 表示大小写字母[a-z A-Z]
[:cntrl:] 表示Ctrl键
[:graph:][:print:] 表示ASCII码33-16之间的字符
[:xdigit:] 表示16进制数字[0-9 A-F a-f]
六、精确匹配:
正则表达式中的“\<\>”用于精确匹配。
例子:
$ grep the 00.pem #列出包含the字符串的行
the jskj 'dff
ddfd df the rlt
gkjtuthelr112
dkfthe the23
the jejk ekj44
jhh lk klrthe 'f'
$
$ grep "\<the\>" 00.pem #精确匹配the这个单词
the jskj 'dff
ddfd df the rlt
the jejk ekj44
$
七、或字符
或字符“|”是扩展的正则表达式中定义的,grep须要加上-E才能支持它。grep -E等价于egrep。
例:搜索00.pem中以冒号“:”或以非英文字母结尾的行。
$ egrep "[^[:alpha:]]$|:$" 00.pem
aslkdlsf:
tji54oio7yu:
gkjtuthelr112
dkfthe the23
the jejk ekj44
jhh lk klrthe 'f'
erkjgtl35:
rgjtkry67
---------------------------------------------
$ grep -E"[^[:alpha:]]$|:$" 00.pem
aslkdlsf:
tji54oio7yu:
gkjtuthelr112
dkfthe the23
the jejk ekj44
jhh lk klrthe 'f'
erkjgtl35:
rgjtkry67
----------------------------------------------------------------
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。
经常使用的 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”,第2、3、四是任意字符,第五个字符是“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" 查询其余用户和用户组成员有可执行权限的目录集合
分类: Linux 2010-05-01 15:55 21458人阅读
首先要记住的是: 正则表达式与通配符不同,它们表示的含义并不相同!
正则表达式只是一种表示法,只要工具支持这种表示法, 那么该工具就能够处理正则表达式的字符串。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”,第2、3、四是任意字符,第五个字符是“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.
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与正则表达式
做者: 字体:[
增长
减少] 类型:转载 时间:2012-09-05
首先要记住的是: 正则表达式与通配符不同,它们表示的含义并不相同!
正则表达式只是一种表示法,只要工具支持这种表示法, 那么该工具就能够处理正则表达式的字符串。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'