正则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 中向正则表达式添加 +(加号)?