正则grep/egrepsedawk

Posted 想剪个寸头

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则grep/egrepsedawk相关的知识,希望对你有一定的参考价值。

正则中 * . ? + 四个符号小总结
 *表示星号前面一样的字符0个或多个显示出来;

 .点表示任意的一个字符,只显示出.点位置的一个字符;

 ?表示0个或1个问号前面的一个字符,要么是一个要么是0个;

 +表示一个或多个加号前面的字符显示出来;

 ###扩展  ^ 符号
 正则中 ^ 号在中括号中表示非的意思,在中括号外就是表示以什么什么开头;
grep/egrep (搜索过滤)
grep和ehrep的区别   egrep是grep的扩展版本
grep root 1.txt 过滤出1.txt文件中包含有root的行;
常用使用选项:
-c 过滤时显示行数  一共有多少行出现过 
-i 不区分大小写
-n 显示行号  把每一行都列出来并显示行号
-v 取反  反着来
-r 遍历所有子目录  例如 搜索/etc 下的123 就能把/etc下所有目录含有123的都列出来
-A 大A 后跟数字(A1)列出带有关键词行并列出行下的下一行;
-B 大B 后跟数字(B1)列出带有关键词行并列出行下的上一行;
-C 大C 后跟数字(C1)列出带有关键词行并列出行下的上一行和下一行;
使用列子:
#grep [0-9]‘ 1.txt 显示出文件中包含0到9数字的文本;
#grep -v [0-9] 1.txt 显示出文件中不包含0到9数字的文件;
#grep ^# 1.txt 显示出以#号开头的文本;
#grep n$ 1.txt 显示出以n结尾的文本;
#grep  -v ^$ 1.txt |grep -v ^# 1.txt  显示出除了不是以$开头的文本也就是空行和不是以#号开头的文本;
#grep -n ^[a-zA-Z] 1.txt 显示出所有大写小写以字母开头的文本;
#grep -n [^a-z] 1.txt 显示出文件中所有的非小写字母也就是 不是小写字母的文本;
###正则中^号在 中括号中表示非的意思,在中括号外就是表示以什么什么开头;
#grep -n [^0-9] 1.txt 显示出文件中所有的非0到9数字也就是 不是数字的文本;
#grep -n ^[^0-9] 1.txt 显示出文件中所有非数字开头的文本;
#grep ro*t 1.txt  *表示星号前面一样的字符0个或多个显示出来;
#grep ro.t 1.txt   .点表示任意的一个字符,只显示出.点位置的一个字符;
#grep -E ro?t 1.txt  ?表示0个或1个问号前面的一个字符,要么是一个要么是0个,?属于特殊符号,在grep中要加减大E,或者直接使用egrep --color ;
#grep -E ’ro+t 1.txt +表示一个或多个加号前面的字符显示出来,+加号同样是属于特殊符号,在grep中要加减大E,或者直接使用egrep --color ;
#grep -E (oo)+ 1.txt  这里小括号中作为一组文本,表示显示出文件中多个oo为一组的文本;
#grep -E (oo) [2] 1.txt 这里是表示显示出大于两个oo的文本,中括号中写几就是大于几;
#grep ro.*t 1.txt .*组合表示任意个任意字符,叫做贪婪匹配,这里是以ro开头的到t结束的文本全部显示出来。
#grep root|nologin 1.txt  这里的|表示或者 搜索 root或者nologin所在的行

###egrep
egrep其实是跟grep一样的,只不过多一些扩展的功能,支持扩展正则表达式;
grep  使用 + ? 这两个符号的时候需要加上—E 选项 如上面列子  如果不加需要 加反斜杠\\进行脱义
      不加-E选项的话 直接使用egrep即可。 
sed (替换)
#sed的常用使用选项
-n 不输出原文件,只输出命令执行后的结果
-p 打印显示
-I 不区分大小写 最好加到-p选项的前面 如/root/Ip  
-d 删除  需要与-i 联合使用  如sed -i /root/d 1.txt  
-s 替换  -g表示全局
-r 使用正则中的特殊符号是 如不脱义的话 需要加上-r选项
#sed的使用介绍  (能实现与grep类似的功能)
#sed -n 1,$p 1.txt  显示出所有内容 p表示打印  中可以自定义数字范围 如 2,6  4,8  1,10  等等
#sed -n -e 1p -e /root/p 1.txt  表示不仅把第一行显示出来 还要把匹配root的行显示出来
#sed 1,10s/root/123/g 1.txt  表示把1-10行中root替换成123  如有特殊字符 需要加上-r 或者脱义
# sed -n /oper/p 1.txt     以此内容为例 进行分段替换
operator:x:11:0:operator:/root:/sbin/nologin
# sed -n /oper/p 1.txt | sed -r s/([^:]+)(:.*:)([^:]+$)/\\3\\2\\1/  
/sbin/nologin:x:11:0:operator:/root:operator  以:为分段符 第一段与最后一段进行互换
awk (打印)
awk的常用使用选项
-F     指定分段
print  打印
$      加数字 表示第几段  $0表示所有
== != > >= < <=  | || &&  
OFS    表示指定打印出来的以什么分隔符来显示
NR     表示行  
NF     表示段
tot/sum

注意: 匹配数字是加上了双引号 就是以ASCII码匹配的  如 $3>"4" 不加双引号就是直接匹配该数字
注意: 加上双引号使用一个等于号 相当于是赋值
例如:
awk -F : $1="root" 1.txt   打印出的结果直接将第一段的所有变成了root 且没有:分隔符显示
awk -F : OFS="#"$1="root"   使用OFS 指定分隔符
#awk的使用介绍
#awk -F : print $1 1.txt   表示以:为分段 打印第一段  $1 表示第一段 $0表示所有 打印所有
#awk -F : print $1,$2,$3,$4 1.txt  打印1234段
#awk -F : $1~/root/ print $3 1.txt $1~/root/是第一段包含root的行,print $3是只要这一行的第三段显示出来
#awk -F : /roo/ print $0 /oper/ print $2,$3,$4 1.txt   也支持多个条件的匹配
#awk -F : /roo|nologin/ print $0 /oper/ print $2,$3,$4 1.txt  或者使用|符号来匹配
#awk -F : $1~/root/ || $3>500 print $0 1.txt 表示匹配第一段包含root或者第三段大于500的打印出来  也可以使用别的符号 如 == != > >= < <=  | || &&
#awk -F : $3<$4 print $0 1.txt    分段对比  第三段小于第四段的
#awk -F : $3>"5" && $3<"7" print $0 1.txt 第三段大于5并且小于7 这里数字以ASCII码匹配的
#awk -F : OFS="#" $3>100 || $7~ /bash/ print $1,$4 1.txt 表示匹配到第三段大于100 或者 第七段含有bash的行之后 将该行的第1段与第四段打印出来并且使用#分隔符隔开
#awk -F : $1~/root/ || $3>500 print NR":"$3 1.txt  加上NR表示打印出来的前面显示行数
#awk -F : $1~/root/ || $3>500 print NF":"$3 1.txt  表示显示该行有多少段
tot/sum  两者一样
#awk -F : (sum=sum+$3); END print sum 1.txt    
这里sum是一个变量,没有给它赋值它的默认值是0,sum=sum+$3就是把文本中的$3的总和值赋给=等于号前面的sum,计算和值的字符要用小括号括起来,表示它们是一个单位,外面花括号括起来表示这是一个循环语句,要用分号隔开,END表示结束,print sum表示求出和值的sum值列出来,在计算时字母自动转换为0 。

#awk -F : (sum=$3+$4); END print sum 1.txt   也可以相加赋值 意思一样

以上是关于正则grep/egrepsedawk的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式量词加号和星号之间的区别

正则表达式电子邮件 - 如何在电子邮件中允许加号?

为啥加号运算符在 JavaScript 的正则表达式中不起作用? [复制]

如何在 Apache RewriteRule 中向正则表达式添加 +(加号)?

linux sed命令中的正则表达式问号加号圆括号等需要转义

在coffeescript / javascript [复制]中使用正则表达式中的字符串中的'+'加号