grep:grep (global search regular expression(RE) ,全面搜索正则表达式)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
UNIX的grep家族包括grep、egrep和fgrep。而egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符,fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义不再特殊。Linux使用GNU版本的grep,它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。
grep命令语法
1 |
grep [OPTIONS] PATTERN FILE |
命令是根据模式(”PATTERN”模式是文本字符和正则表达式的元字符组合而成的匹配条件)搜索文本并将符合模式的文本行显示出来。
[OPTIONS]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
-i #忽略大小写 -n #显示行号 --color #配置到的内容高亮显示 -v #显示没有被模式匹配到的行 -o #只显示被模式匹配到的字符串 -w #执行单词匹配搜索 -s #仅显示出错消息,这点对检查状态有用 -x #显示与指定模式精确匹配而不含其它字符的行 -c #仅显示匹配行的计数 -h #不输出前缀文件名 -q #禁止所有的输出到标准输出,不管匹配行。如果选中输入行,以 0 状态退出 -E #扩展正则表达式或egrep -A 1 #显示被匹配到的行和被匹配到的行的下一行 -B 1 #显示被匹配到的行和被匹配到的行的上一行 -C 1 #显示被匹配到的行和被匹配到的行的上下各一行\ |
PATTERN(普通模式)
1 2 3 4 5 6 7 8 9 10 11 12 |
# 匹配有root字符的行,并高亮显示; $ grep --color "root" /etc/passwd # 匹配有root字符的行,但显示没有root的行; $ grep -v "root" /etc/passwd # 匹配有root字符的行,并显示行号; $ grep -n "root" /etc/passwd # 匹配/etc目录下所有文件,显示带有root字符的行,但是会在匹配到的行前面显示文件名; $ grep "root" /etc/* # 匹配/etc目录下所有文件,显示带有root字符的行,但是不会显示前缀文件名; $ grep -h "root" /etc/* # 在当前目录及其子目录下搜索带有root字符的行文件,但是会在匹配到的行前面显示文件名; $ grep -r "root" /etc/* |
PATTERN(使用正则表达式的元字符组合而成的匹配条件,以下就是介绍正则表达式)
正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。
正则表达式是由普通字符(例如字符a到z)以及特殊字符(也称为”元字符”)组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
1)非打印字符
1 2 3 4 5 6 7 |
\f #匹配一个换页符; \n #匹配一个换行符; \r #匹配一个回车符; \s #匹配任何空白字符,包括空格、制表符、换页符等等; \S #匹配任何非空白字符; \t #匹配一个制表符; \v #匹配一个垂直制表符; |
2)限定符
1 2 3 4 5 6 7 8 9 |
. #匹配任意单个字符,除特殊字符。如:grep "r..t" /etc/passwd; * #匹配前面字符出现次数的零次或多次,等效于{0,}。如ro*t与“rt”和"root"匹配; + #匹配前面字符出现次数的一次或多次,等效于{1,}。如ro\+t和“rot”和"root"匹配,“\”表示转义字符; ? #匹配前面字符出现次数的0或1次,等效于{0,1}。如:ro\?t和"rt"和"rot"匹配,“\”表示转义字符。当该字符紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后时, #匹配模式时非贪婪的,非贪婪模式匹配搜索到的尽可能少的字符串,而默认的贪婪模式匹配搜索到的尽可能多的字符串; {n} #匹配前面字符正好出现n次,n是非负整数; {n,} #匹配前面字符最少出现n次,如:grep "r\{1\}t" /etc/passed,表示匹配r正好出现1次而且此表达式并以t结束的显示出来; {n,m} #匹配前面字符最多出现n次最少m次,如:grep "r\{1,2\}t" /etc/passwd,意思是匹配r字符最少出现1次而最多出现2次;而且此表达式并以t结束的显示出来; .* #匹配任意长度的任意字符,除特殊字符;如:grep "r.*o" /etc/passwd,意思是一个r开头o结尾的; |
3)定位符
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
^ #锚定行首,此字符后面跟的所有内容必须出现在行首,如grep "^r" /etc/passwd $ #锚定行尾,此字符后面跟的任意内容必须出现在行尾,如grep "b..h$" /etc/passwd ^$ #匹配空白行,如:grep -v "^$" /etc/inittab [^] #反向字符集,与未指定的任何字符匹配 [abc] #匹配指定范围内的任意字符 [0-9] #匹配指定范围内的数字 [a-z] #匹配指定范围内的小写字母 [A-Z,a-z] #匹配指定范围内的大小写字母 [:digit:] #匹配所有数字 [:lower:] #匹配所有小写字母 [:upper:] #匹配所有大写字母 [:punct:] #匹配所有标点符号 [:space:] #匹配空格 [:alpha:] #匹配所有字母 [:alnum:] #匹配所有数字和字母 \< OR \b #字符边界匹配,其后面的任意字符必须作为单词首部出现,如\bne与"never"中的"ne"匹配,但与"lnever"中的"ne"不匹配 \> OR \b #字符边界匹配,其前面的任意字符必须作为单词的尾部出现,如er\b与"never"中的"er"匹配,但与"verb"中的"er"不匹配 \B #非字符边界匹配,如er\B与"never"中的"er"不匹配,但与"verb"中的"er"匹配 \<root\> #锚定其字符为单个单词出现 |
4)分组
1 |
\(\) #将()之间的表达式定义为"组"(group),并且将匹配这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存9个),它们可以用\1到\9的符号来引用。 |
5)特殊字符
许多元字符要求在试图匹配它们时特别对待。若要匹配这些特殊字符,必须首先使字符”转义”,即,将反斜杠字符 (\) 放在它们前面。
下表列出了正则表达式中的特殊字符:
1 2 3 4 5 6 7 8 9 10 11 |
$ #匹配输入字符串的结尾位置,如果设置了RegExp对象的Multiline属性,则$也匹配'\n'或'\r',要匹配$字符本身,请使用\$; () #标记一个子表达式的开始和结束位置,子表达式可以获取供以后使用。要匹配这些字符,请使用\(和\); * #匹配前面的子表达式零次或多次,要匹配*字符,请使用\*; + #匹配前面的子表达式一次或多次,要匹配+字符,请使用\+; . #匹配除换行符\n之外的任何单字符。要匹配.,请使用\; [ #标记一个中括号表达式的开始,要匹配[,请使用\[; ? #匹配前面的子表达式零次或一次,或指明一个非贪婪限定符,要匹配=?字符,请使用\?; \ #将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如,'n'匹配字符'n'。'\n'匹配换行符。序列'\\'匹配"\",而'\('则匹配"("; ^ #匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合,要匹配^字符本身,请使用\^; { #标记限定符表达式的开始,要匹配{,请使用\{; | #指明两项之间的一个选择,要匹配|,请使用\|; |
在grep命令中输入字符串参数时,最好将其用双引号括起来。例如:“mystring”。这样做有两个原因,一是防止被误解为shell命令,而是可以用来查找多个单词组合成的字符串, 例如:“jet plane”,如果不用双引号将其括起来,那么单词plane将被误认为是一个文件,查询结果将返回“文件不存在”的错误信息。在调用变量时,也应该使用双引号, 诸如:grep “$myvariables”文件名,如果不这样将没有返回信息。
另外当需要检索压缩文件时(一般都是处理压缩日志),可以使用zcat查看压缩文件内容然后输出给grep处理。或者使用zgrep -h可以直接检索.gz的压缩文件。
cut:文本处理命令并不会影响原文件
1 2 3 4 |
$ cut [OPTION] FILE -d #指定字段分隔符,默认是以空格为分隔符,一般分隔符使用":" -f #指定要显示的字段以数字区分1,2,3….1-3 -c #指定要显示的字符个数 |
使用实例
1 2 3 4 5 6 |
# 表示以:为分隔符并显示第一个字段; $ cut -d: -f1,3 /etc/passwd # 只显示每一行的前四个字符; $ cut -c 1-4 /etc/passwd $ cut -d: -f7 /etc/passwd | sort -u |
sort:对文本内容进行排序的命令,文本默认是以ASCII码表进行排序的
1 2 3 4 5 6 7 |
$ sort [OPTION] FILE -n #以数值进行排序,默认是升序; -n -r #以降序进行排序; -t #字段分隔符,如"-t:"表示指定以":"为分隔符; -k4 #以哪个字段为关键字进行排序1,2,3,4…;要配置-t一块使用,如"-t: -k4"表示以":"为分隔符,排序字段为第4个字段; -n -u #以数值进行排序,排序后相同的行只显示一次; -f #排序时忽略字符大小写; |
使用实例
1 2 |
# 表示以数值并降序和以:为分隔符第4个字段进行排序如果有相同的只显示一次就行排序时忽略大小写; $ sort -n -r -t: -k4 -u -f /etc/passwd |
uniq:整理文件中重复的行
1 2 3 4 |
$ uniq [options] FILE -u #只显示不重复的行 -c #只显示文件中行重复的次数 -d #只显示重复的行 |
tr:字符转换或删除字符的命令
1 |
$ tr [OPTION] SET1 SET2 |
1 2 3 4 5 6 7 8 |
# 只要出现a或b的都转换为A或B; $ tr 'ab' 'AB' < /etc/shadow # 转换全部的字符集; $ tr 'a-z' 'A-Z' < /etc/shadow # 删除字符集只要有ab的字符; $ tr –d 'ab' < /etc/shadow |
wc:用来统计文件中的行、字符、单词数量的命令
1 2 3 4 5 |
$ wc [OPTIONS] FILE -l #line,统计行; -c #character,统计字符; -w #word,统计单词; -L #long表,示最长一行包含多少个字符; |
join:用来将来自两个分类文本文件的行连在一起,有点像SQL语句中的多表查询;每个文件里都有一些元素与另一个文件相关。由于这种关系, j o i n将两个文件连在一起,这有点像修改一个主文件,使之包含两个文件里的共同元素。文本文件中的域通常由空格或t a b键分隔,但如果愿意,可以指定其他的域分隔符。一些系统要求使用j o i n时文件域要少于2 0,为公平起见,如果域大于2 0,应使用D B M S系统。
1 2 3 4 5 6 7 8 9 10 |
-a<1或2> #除了显示原来的输出内容之外,还显示指令文件中没有相同栏位的行 -e<字符串> #若[文件1]与[文件2]中找不到指定的栏位,则在输出中填入选项中的字符串 -i或--igore-case #比较栏位内容时,忽略大小写的差异 -o<格式> #按照指定的格式来显示结果 -t<字符> #使用栏位的分隔字符 -v<1或2> #跟-a相同,但是只显示文件中没有相同栏位的行 -1<栏位> #连接[文件1]指定的栏位 -2<栏位> #连接[文件2]指定的栏位 --help #显示帮助 --version #显示版本信息 |
split:字符分离命令。