正则 基本用法

内容概要

正则就是有一定规律的字符串,有几个特殊符号很关键(. * + ? | ),我们平时不仅可以用命令行工具grep/sed/awk去引用正则,而且还可以把正则嵌入在nginx、apache、甚至php、python编程语言当中,学好正则可以让你受用无穷!
一、grep/egrep 
1. 语法+选项
语法: grep  [-cinvABC]  ‘word‘  filename 
-c :打印符合要求的行数
-n :在输出符合要求的行的同时连同行号一起输出 
-v :打印不符合要求的行 
-A :后跟一个数字(有无空格都可以),例如 –A2则表示打印符合要求的行以及下面两行 
-B :后跟一个数字,例如 –B2 则表示打印符合要求的行以及上面两行  
-C :后跟一个数字,例如 –C2 则表示打印符合要求的行以及上下各两行 
-r : 会把目录下面所有的文件全部遍历

2. 例子介绍
过滤出带有某个关键词的行并输出行号 grep -n ‘root‘ 1.txt 
过滤出不带有某个关键词的行并输出行号grep -n -v ‘root‘ 1.txt
过滤出所有包含数字的行 grep ‘[0-9]‘ 1.txt
过滤出所有不包含数字的行 grep -v ‘[0-9]‘ 1.txt
去除所有以‘#‘开头的行 grep -v ‘^#‘ 1.txt
去除所有空行和以‘#‘开头的行 grep -v ‘^$‘ 1.txt|grep -v ‘^#‘
过滤出以英文字母开头的行 grep ‘^[a-zA-Z]‘ 1.txt
过滤出以非数字开头的行 grep ‘^[^0-9]‘ 1.txt
过滤任意一个或多个字符 grep ‘r.o‘ 1.txt; grep ‘r*t‘ 1.txt; grep ‘r.*t‘ 1.txt  
. 表示任意一个字符;*表示零个或多个前面的字符 ;.*表示零个或多个任意字符,空行也包含在内 
指定过滤字符次数 grep ‘o\{2\}‘ 1.txt

3. egrep
egrep工具 是grep工具的扩展
egrep ‘o+‘ 1.txt   表示1个或1个以上前面字符
egrep ‘o?‘ 1.txt  表示0个或者1个前面字符
egrep ‘roo|body‘ 1.txt  匹配roo或者匹配body
egrep ‘r(oo)|(at)o‘ 1.txt 用括号表示一个整体
egrep ‘(oo)+‘ 1.txt 表示1个或者多个 ‘oo‘

4. . * + ? 总结
. 表示任意一个字符(包括特殊字符)
* 表示零个或多个*前面的字符
.* 表示任意个任意字符(包含空行)
+ 表示1个或多个+前面的字符
? 表示0个或1个?前面的字符
其中,+ ? grep不支持,egrep才支持。

二.  sed 
打印指定行 sed ‘10‘p -n 1.txt; sed ‘1,4‘p -n 1.txt; sed ‘5,$‘p -n 1.txt
打印包含某个字符串的行 sed -n ‘/root/‘p 1.txt 可以使用 ^ . * $等特殊符号
-e 可以实现同时进行多个任务 sed -e ‘/root/p‘ -e ‘/body/p‘ -n 1.txt 也可以用;实现  sed  ‘/root/p; /body/p‘ -n 1.txt
删除行 sed ‘/root/d‘ 1.txt;   sed ‘1d‘ 1.txt; sed ‘1,10d‘ 1.txt
替换 sed ‘1,2s/ot/to/g‘ 1.txt, 其中s就是替换的意思,g为全局替换,否则只替换第一次的,/也可以为 #, @ 等
删除所有数字 sed ‘s/[0-9]//g‘ 1.txt
删除所有非数字  sed ‘s/[^0-9]//g‘ 1.txt
调换两个字符串位置 head -n2 1.txt |sed ‘s/\(root\)\(.*\)\(bash\)/\3\2\1/‘
直接修改文件内容 sed -i ‘s/ot/to/g‘ 1.txt

sed练习题:
把/etc/passwd 复制到/root/test.txt,用sed打印所有行
打印test.txt的3到10行
打印test.txt 中包含 ‘root‘ 的行
删除test.txt 的15行以及以后所有行
删除test.txt中包含 ‘bash‘ 的行
替换test.txt 中 ‘root‘ 为 ‘toor‘
替换test.txt中 ‘/sbin/nologin‘ 为 ‘/bin/login‘
删除test.txt中5到10行中所有的数字
删除test.txt 中所有特殊字符(除了数字以及大小写字母)
把test.txt中第一个单词和最后一个单词调换位置
把test.txt中出现的第一个数字和最后一个单词替换位置
把test.txt 中第一个数字移动到行末尾
在test.txt 20行到末行最前面加 ‘aaa:‘

答案:

1. /bin/cp/etc/passwd /root/test.txt; sed-n‘1,$‘p test.txt 
2. sed-n‘3,10‘p test.txt 
3. sed-n‘/root/‘p test.txt 
4. sed‘15,$‘d test.txt 
5. sed‘/bash/‘d test.txt 
6. sed‘s/root/toor/g‘test.txt 
7. sed‘s#sbin/nologin#bin/login#g‘ test.txt 
8. sed‘5,10s/[0-9]//g‘test.txt 
9. sed‘s/[^0-9a-zA-Z]//g‘test.txt 
10. sed‘s/\(^[a-zA-Z][a-zA-Z]*\)\([^a-zA-Z].*\)\([^a-zA-Z]\)\([a-zA-Z][a-zA-Z]*$\)/\4\2\3\1/‘ 
test.txt 
11. sed 
‘s#\([^0-9][^0-9]*\)\([0-9][0-9]*\)\([^0-9].*\)\([^a-zA-Z]\)\([a-zA-Z][a-zA-Z]*$\)#\1\5\3\4\2#‘ 
test.txt

12. sed‘s#\([^0-9][^0-9]*\)\([0-9][0-9]*\)\([^0-9].*$\)#\1\3\2#‘ test.txt 
13. sed‘s/^.*$/&aaa/‘test.txt

三.  awk
截取文档中的某段 awk -F ‘:‘ ‘{print $1}‘ 1.txt
也可以使用自定义字符连接每个段 awk -F‘:‘ ‘{print $1"#"$2"#"$3"#"$4}‘ 1.txt
匹配字符或字符串 awk ‘/oo/‘ 1.txt
针对某个段匹配 awk -F ‘:‘ ‘$1 ~/oo/‘ 1.txt
多次匹配 awk -F ‘:‘ ‘/root/ {print $1,$3}; $1 ~/test/; $3 ~/20/‘ 1.txt
条件操作符==, >,<,!=,>=;<=  
awk -F ‘:‘ ‘$3=="0"‘  1.txt; 
awk -F ‘:‘ ‘$3>="500"‘ 1.txt; 
awk -F ‘:‘ ‘$7!="/sbin/nologin"‘  1.txt; 
awk -F ‘:‘ ‘$3<$4‘ 1.txt ; 
awk -F ‘:‘ ‘$3>"5" && $3<"7"‘ 1.txt 
awk -F ‘:‘ ‘$3>"5" || $7=="/bin/bash"‘ 1.txt
awk内置变量 NF(段数)  NR(行数)
head -n3 1.txt | awk -F ‘:‘ ‘{print NF}‘ 
head -n3 1.txt | awk -F ‘:‘ ‘{print $NF}‘ 
head -n3 1.txt | awk -F ‘:‘ ‘{print NR}‘ 
打印20行以后的行awk ‘NR>20‘ 1.txt
awk -F ‘:‘ ‘NR>20 && $1 ~ /ssh/‘  1.txt 
更改某个段的值awk -F ‘:‘ ‘$1="root"‘ 1.txt
数学计算, 把第三段和第四段值相加,并赋予第七段 awk -F ‘:‘ ‘{$7=$3+$4; print $0}‘ 1.txt
计算第三段的总和 awk -F ‘:‘ ‘{(tot=tot+$3)}; END {print tot}‘ 1.txt
awk中也可以使用if关键词 awk -F ‘:‘ ‘{if ($1=="root") print $0}‘ 1.txt

awk练习题
用awk 打印整个test.txt (以下操作都是用awk工具实现,针对test.txt)
查找所有包含 ‘bash‘ 的行
用 ‘:‘ 作为分隔符,查找第三段等于0的行
用 ‘:‘ 作为分隔符,查找第一段为 ‘root‘ 的行,并把该段的 ‘root‘ 换成 ‘toor‘ (可以连同sed一起使用)
用 ‘:‘ 作为分隔符,打印最后一段
打印行数大于20的所有行
用 ‘:‘ 作为分隔符,打印所有第三段小于第四段的行
用 ‘:‘ 作为分隔符,打印第一段以及最后一段,并且中间用 ‘@‘ 连接 (例如,第一行应该是这样的形式 ‘[email protected]/bin/bash‘ )
用 ‘:‘ 作为分隔符,把整个文档的第四段相加,求和

下面给出答案:

1. awk ‘{print $0}‘ test.txt

2. awk ‘/bash/‘ test.txt

3. awk -F‘:‘ ‘$3=="0"‘ test.txt

4. awk -F‘:‘ ‘$1=="root"‘ test.txt |sed ‘s/root/toor/‘

5. awk -F‘:‘ ‘{print $NF}‘ test.txt

6. awk -F‘:‘ ‘NR>20‘ test.txt

7. awk -F‘:‘ ‘$3<$4‘ test.txt

8. awk -F‘:‘ ‘{print $1"@"$NF}‘ test.txt

9. awk -F‘:‘ ‘{(sum+=$4)}; END {print sum}‘ test.txt

扩展阅读:扩展阅读:

1. grep 其实还可以这样使用:
把一个目录下,过滤所有*.php文档中含有eval的行
grep -r --include=“*.php" ‘eval‘ /data/

实际应用:看看你的网站程序有没有被黑客入侵  http://www.lishiming.net/thread-1028-1-1.html

2. awk用print打印单引号 http://www.lishiming.net/thread-1738-1-1.html
3. 打印文件中特定的某行到某行之间的内容  http://www.lishiming.net/thread-559-1-1.html
4. awk 中使用外部shell变量 http://www.lishiming.net/thread-199-1-1.html
5. awk 合并一个文件 http://www.lishiming.net/thread-493-1-1.html
6. grep -q 用于if 逻辑判断 http://www.lishiming.net/thread-439-1-1.html
7. awk 计算1到100的和 http://www.lishiming.net/thread-384-1-1.html
8. 把一个文件多行连接成一行 http://www.lishiming.net/thread-266-1-1.html
9. awk中gsub函数的使用 http://www.lishiming.net/thread-200-1-1.html
10. sed在文件中某一行最后添加一个数字 http://www.lishiming.net/thread-288-1-1.html
11. awk 截取指定多个域为一行 http://www.lishiming.net/thread-224-1-1.html
12. sed删除某关键字的下一行到最后一行 http://www.lishiming.net/thread-213-1-1.html
13. grep 或 egrep 或awk 过滤两个或多个关键词 http://www.lishiming.net/thread-198-1-1.html
14. 用awk编写生成以下结构文件的程序 http://www.lishiming.net/thread-5494-1-1.html
15. 如何使用sed打印1到100行包含某个字符串的行  http://www.lishiming.net/thread-1048-1-1.html
16. 把两个文件中相同的行合并成一行 http://www.lishiming.net/thread-945-1-1.html
17. sed转换大小写  http://www.aminglinux.com/bbs/thread-7758-1-1.html
18. awk教程  http://www.cnblogs.com/emanlee/p/3327576.html

时间: 2024-10-18 01:44:51

正则 基本用法的相关文章

正则 ?&lt;= 和 ?= 用法

参考网址:http://baike.baidu.com/link?url=2zORJF9GOjU8AkmuHDLz9cyl9yiL68PdW3frayzLwWQhDvDEM51V_CcY_g1mZ7OPdcq8exFSiLusZwODAos5C_ http://www.cnblogs.com/xiashengwang/p/3988573.html   http://www.cnblogs.com/symbol441/articles/957950.html  文本: <br/>您好,非常好,很

正则 ?&lt;= 和 ?= 用法,范例

(exp) 匹配exp,并捕获文本到自动命名的组里(?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)(?:exp) 匹配exp,不捕获匹配的文本位置指定(?=exp) 匹配exp前面的位置(?<=exp) 匹配exp后面的位置(?!exp) 匹配后面跟的不是exp的位置(?<!exp) 匹配前面不是exp的位置 ----------------------------------------------------------

正则grep用法

语法:grep 选项 'word' filename-c:打印符合要求的行数-i:不区分大小写-n:在输出符合要求的行的同时显示行号-v:打印不符合要求的行-A:后跟一个数字n,表示打印符合要求的行以及下面n行-B:后跟一个数字n,表示打印符合要求的行以及上面n行-C:后跟一个数字n,表示打印符合要求的行以及上下各n行-r:会把目录下所有的文件全部遍历--color:把匹配到的关键词用红色标示例子: 过滤出带有某个关键词的行并输出行号grep -n 'root' 1.txt 过滤出不带有某个关键

扩展正则及正则基本用法

原文地址:http://blog.51cto.com/14134351/2338072

js正则学习

一直对正则很纠结也很畏惧,以前感觉花时间理解一个个奇奇怪怪的符号,还不如直接百度谷歌之. 但知其然不知其所以然也是种痛苦,所以花了两天稍微学了一下,虽然没学很深入彻底,但也比之前进步不少,特此笔记. js正则 g:表示全局,匹配全部i:表示不区分大小写m:表示匹配多行(匹配换行两端的潜在匹配) RegExp实例属性: global:是否设置了g ignoreCase:是否设置了i  lastIndex:表示下一次exec开始搜索下个匹配项的字符位置  multiline:表示是否设置了m  so

Python re模块, xpath 用法

1.re正则的用法总结 (1). ^ 表示以哪个字符为开头      eg:  '^g' 表示以g开头的字符串      . 表示任意字符 '^g.d'  表示以g开头第二个为任意字符,第三个为b的字符串  *表示  某个字符出现任意多次 import re line = 'bobby123' regex_str = '^b.*' #以b开头的任意字符串出现任意多次 ^以什么开头 .任何字符 *出现任意多次 if re.match(regex_str,line): print('yes') (2

Linux下grep入门

Linux下入门grep用法 1.grep简述及特点 简介:全局搜索正则表达式出来的行并打印 (Global search REgular expression and Print out the line),一种按照特定模式(pattern)的文本过滤工具 模式:pattern,通过有正则表达式(refexp)特殊字符以及文本字符组成的条件来过滤 正则表达式:refexp,有一些bash支持的特殊文本字符来表示特殊含义,如果特殊字符当原本字符匹配需要转义 2.正则表达式分类 基本正则表达式:

JS正则表达式完整教程(略长)

JS正则表达式完整教程(略长) 引言 亲爱的读者朋友,如果你点开了这篇文章,说明你对正则很感兴趣. 想必你也了解正则的重要性,在我看来正则表达式是衡量程序员水平的一个侧面标准. 关于正则表达式的教程,网上也有很多,相信你也看了一些. 与之不同的是,本文的目的是希望所有认真读完的童鞋们,都有实质性的提高. 本文内容共有七章,用JavaScript语言完整地讨论了正则表达式的方方面面. 如果觉得文章某块儿没有说明白清楚,欢迎留言,能力范围之内,老姚必做详细解答. 具体章节如下: 引言 第一章 正则表

python:正则表达式 re

#re正则的用法:match匹配从开头 search 取一个就回来了,findout取所以匹配的,slit分割 sub替换 #-*- coding:utf8 -*- # Auth:fulimei #re正则的用法:match匹配从开头 search 取一个就回来了,findout取所以匹配的,slit分割 sub替换 import re res=re.match('^chen','chenronghua')#^匹配字符开头 resa=res.group()#匹配的字符打印出来 print(res