小Q:无论世界是否待你温柔,请保持你的善良,因为好运会与你不期而遇,
善良的心灵运气不会差。
今天学习的是正则表达式使用的四种工具,因为昨天已经看了两种了,所以今天
比较早的就看完了;但是这一章节不多动动脑子是真的会被他搞晕的,仔细去想,把自己想成一种特殊字符,深入理解,其实也没什么难得,只不过这种类型要多练
才能把他巩固。写完之后,晚上我要大幅度的做题了。
grep 工具:
格式: grep 选项 ‘匹配符’ 文件
选项: --color 显示匹配符的颜色 -n 显示行号
-c 只显示出现几行 -v 取反,输出不含匹配符的行
-A2 输出匹配符行,并附加旗下两行
-B3 输出匹配符行,并附加其上三行
-C3 输出匹配字符行,并附加上下个三行
-r 检索目录下的包含匹配符的行 ,可-rh 不要前边路径文件
*** 匹配符: 【】 范围,表示其中任意一个就行
^【】 以里边任意一个字符开头即可
【^ 】 除里边字符以外的都行
^$ ^是开头,$是结尾,表示空行
. 任意一个字符
* 0个或多个 * 之前的字符
.* 0个多个任意字符,all
举例: ‘r.*o’ 0个或多个任意字符,但必须以 r 开头, o 结尾
‘r*o’ 可匹配 o / ro /rro /rrro/ 等rrro
‘r.o’ 只能首字母是r 尾字母是o ,中间随意的组合
‘【^0-9】’ 匹配除了数字以外的所有字符
特殊匹配符:
\?=-E ? 0个或一个?前的字符 \ 脱义符
+ 1个或多个 + 之前的字符
( ) 组合,里边的东西是一个整体
{1,3} 1 到 3 次
| 表示或 与用管道符叠加
举例:
‘r\?o’= -E ‘r?o’ 可匹配o/oo/ooo等/ro/roo/roo等,不能匹配 rr 两个连续的
‘(rr){1,3}’ rr 一起可以出现1到3次 ,但必须是偶数个r
‘a+b’ 可匹配 ab /aab/ aab/ aaaab`````1个或多个a 加b
要注意,他有可能连着出现 1次有连续出现 3次
特殊符号使用时要加脱义符,或者用选项 -E 来代替,或者用egrep去过滤;
egrep 工具:
前面也说过,grep -E = egrep 是相等;
简单地说 egrep 是 grep 的扩展或者升级版吧,egrep可以用的 grep 都可以
用,只是要加上-E ,grep 能用的,egrep 都能用,格式也一样。
sed 工具:
功能多,比grep多删除,替换等的功能;但是没有颜色显示。
打印: sed ‘1,8‘p 1.txt 打印 1到 10行,p是打印,但他显示的是全部
然后1到10复制了一遍 加 - d
删除: sed ‘1,7’d 1.txt 删除1到7行,但他不会真的删除文件中的内 容,只是显示在屏幕上 真删 - i
过滤: sed -r ‘/ 匹配符/’ 1.txt - r 代替了脱义符
替换: sed ‘1,10s/old/new/g’ 1.txt
有时替换的词中包含特殊字符,此时要转换一种方式,如:
sed ‘1,10s//\new/g’ 1.txt = sed ‘1,10s#old#new#g’ 1.txt
任意字符开头 : ^ . & 一整行 : ^ . * $
将new 加在末尾: &new 打印包含a或b的行: ‘/ a|b /’
分号类似 |,不过他会打印好多相同的行,如:‘/a/p ; /b/p’
举例: sed ‘s#[a-zA-Z]##g’ 1.txt 删除字母
sed ‘s#^.*$#new#g’ 1.txt new替换每一行
sed -r ‘s/^.$/new/g’ 1.txt new替换首字母
题:
passwd文档中,以冒号分隔,替换首尾段
sed ‘s#(^[a-zA-Z0-9]+)(:.*:)(.*$)#\3\2\1#g’ 1.txt
其实重点在分段,首 中 尾
=sed -r ‘s/([^:]+)(:. *:)([^:]+)/ \3\2\1 /g’ 1.txt
awk 工具:
可以分段 匹配 和打印;不用进行脱义就可用特殊符号;不支持 {}
格式: awk -F‘分隔符’ ‘OFS="分隔符" {print $3,$4}’ 1.txt
-F‘分隔符’ : 以文件中分隔符分段
OFS="分隔符": 打印的内容用分隔符隔开
匹配: ‘/user | root/’ ‘/r*o/’ ‘[aN]’ ‘/r+o/’ ‘/^[a-z]/’
格式: awk -F‘:’ ‘匹配’ 文件
格式:awk -F ‘:’ ‘$1~/r*o/ {print $1,$3} ; $1~/nolog/ {print $1,$3}’ 1.txt
awk -F ‘:’ ‘$1~/r*o | nolog/ {print $1,$3}’ 1.txt
$数字~:固定格式,查询第几段
;和 | 的用法和sed一样,;显示重复行
意思:以:分段,找到包含 r*o 或 nolog的行,然后打印出第 1和第 3行。
awk 的符号:
== >= <= != < > ‘{if (条件 ) 结果 }’有时条件后要加;隔开
内置变量:
NR表示行 ‘NR<10’ 输出前十行
‘print $NR’第一行打印$1,第二行打印$2·····
NF 每行里的段 ‘NF<10’ 输出前十段
‘print $NF’有7段打印$7,八段就打印$8
‘NF‘ 输出每一行有几段
‘{ if (NF=7) print $3 }’哪一行有7段,就打印哪一行的$3
帮助文档中单词:
matching 匹配 version 版本 generic 通用的
synopsis 大纲 pattern 模式 comparing 比较
aviod 避免 duplicate 重复的 omit 省略
report 报告 delimiter 分隔符 contians 中突出
fields 字段 field 领域 instead 而不是
section 部分 standard 标准 execute 执行
练习题: