一、正则表达式的定义:
就是以行为单位处理字符串的方式。
1. 元字符:不表示字符本身的意义,用于额外功能性的描述。
1)字符匹配:
.:匹配任意单个字符
[]:匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符
[:digit:]:代表数字,既0-9
[:alnum:]:代表代表英文大小写字符及数字,即a-z,A-Z,0-9
[:alpha:]:代表代表英文大小写字符a-z,A-Z
[:cntrl:]:代表键盘上的控制按键,
[:graph:]:除了空格符(空格和[tab]键)以外的
[:print:]:代表任何可以打印出来的字符
[:punct:]:代表标点符号
[:upper:]:代表大写字符即A-Z
[:space:]:代表可以产生空白的字符
[:xdigit:]:代表16进制的数字类型,包括0-9,A-F,a-f
2)次数匹配
* :匹配任意次 如:x*y: xxy xy y
.*:匹配任意长度的任意字符,0次或多次。
\?:匹配0次或1次 如:x\?y: xy y xxy
xxy是匹配了x 2次,这也能行?当然,因为,grep有贪婪模式,尽可能长的去匹配字符。
\{m\}:匹配m次 这里的\代表转义字符,扩展正则表达式中不用
\{m,n\}:匹配最少m次,最多n次
\{0,n\}:匹配至多n次
3)位置锚定: 用于指定字符出现的位置
^:托字符,锚定行首 ^char
$:锚定行尾 char$
^$:空白行 既是行首,又是行尾,当然就是空白行了
\<:锚定词首 \<char \bchar 这里的\依然是转义
\>:锚定词尾 char\> char\b
\<hello\>:既锚定词首又锚定词尾,当然是锚定hello这个单词。
4)分组
\(\) \给括号转义 用与后面的引用使用。
5)引用
\1:前向引用,引用前面的第1个左括号以及与之对应的右括号中的模式所匹配到的内容 \(a.b\)xy\1 --> a6bxya6b
\2:前向引用,引用前面的第2个左括号以及与之对应的右括号中的模式所匹配到的内容
二、相关常用命令:
1.grep:
功能:文本搜索工具,以行为单位进行字符串数据对比,将符合要求的打印出来。
格式:grep [options] 'PATTERN' file,简单理解:直接命令+'PATTERN'+文件
常用选项:
-v:反向匹配,显示不能被模式所匹配到的行。
-o:仅显示被模式匹配到的字串,而非整行。
-i:不区分大小写,ignore-case
-E:支持扩展正则表达式,Expand
-A:显示匹配行及下一行,after
-B:显示匹配行及上一行,befoe
--color=auto 匹配到的高亮度显示。
2. egrep 扩展正则表达式
功能和用法和grep一样,,只是在扩展正则表达式中不需要转义符\
eg:
3)锚定:
^:锚定行首
$:锚定行尾
4)分组:
():
| :或者 基本正则表达式中没有|
5)引用:
\1:前向引用,引用前面的第1个左括号以及与之对应的右括号中的模式所匹配到的内容
3.fgrep
命令是用来查找一个或多个与给出的字符串或词组相匹配文件中的行。fgrep 查询速度比grep命令快,但是不够灵活:它只能找固定的文本,而不是规则表达式。
-b:在找到的每行之前添加行所在的块编号。使用此标志有助于按照上下文查找磁盘块号码。
-c:仅显示匹配行的计数。
-e 模式:指定模式。这个工作模式很简单,但当此模式以 a-(减号) 开头时却是很有用的。
-f StringFile:指定包含字符串的文件。
此命令返回以下出口值: 0 找到匹配项。 1 未找到匹配项。 >1 发现语法错误,或者文件不可访问(即使找到了匹配项)。
4. sed 行编辑器 一次只读一行
处理机制:按换行符截取,从文件中一次只读取一行。 把文件加载到内存特定空间(模式空间)之后,由sed命令从内存缓冲区当中一次加载一行出来,并进行编辑,编辑完放到屏幕上。
用法:
sed [options] 'addr1[,addr2]编辑命令' FILE ...
sed [options] “addr1[,addr2]编辑命令” FILE ... 做变量替换用的。
选项(option):
-r: 扩展的正则表达式
-f /path/to/sed_script_file: 指定sed脚本文件
-e 'script' -e 'script': 指定多个编辑指令
-i: 直接编辑原文件
编辑命令:
d: 删除
p: 打印
a \text: 之后添加
r /path/to/somefile: 在指定位置把另外一个文件的内容插入进来
w /path/to/somefile:将符合条件的所有行保存至指定的文件中
=:显示符合条件的行的行号
s///: 查找条件可以使用模式,但要替换的内容不行
地址定界:
/pat1/,/pat2/ 从第一个符合模式行开始到第一个符合模式2的行结束。
sed常用命令:sed '地址定界s@查找条件@替换文本@'
修饰符:
g: global,全局替换
i: ignore-case,不区分字符大小写
eg:
1、替换/etc/inittab文件中“id:3:initdefault:”一行中的数字为5;
# sed 's@\(id:\)[0-9]\(:initdefault\)@\15\2' /etc/inittab
5.awk
awk仅仅是将读进来的内容进行过滤显示, 所以是一个过滤显示工具。目的是为了生成一个美观的结果。且结果是可以指定现实的。
1用法: awk [options] 'script' FILE ...
awk [options] '/pattern/{action}' FILE ...
action: print $1,$1
默认分隔符是空白,
-F 指定分隔符:
eg: # awk -F : '$3<500{print $1}' /etc/group 指定的分隔符位:
2.awk的常用四种分隔符:
输入:
行分隔符
字段分隔符
输出:
行分隔符
字段分隔符
awk的内置变量:
NF:字段数 (所以$NF表示最后一个字符。)
FS: 读入行时使用的字段分隔符,默认为空白
OFS: 输出时使用字段分隔符,默认为空白
三、实战:
1. grep:
1,取出默认shell为非bash的用户;
2,取出默认shell为bash的且其ID号最大的用户;
3、grep配合其它命令的用法,找出本机的IP地址,只显示IP段(管道、cut)
2.egrep
显示/boot/grub/grub.conf中以至少一个空白符开头的行
3. sed
1 删除以#开头的所有# 。 (这里^#必须用双斜线扩住。)
[root@xiaoxiao ~]# sed '/^#/d' /etc/fstab
2.删除以\开头必须用转义符
# sed '/^\//d' /etc/fstab
3 给以#开头的后面的下一行加一句hello
4.删除/boot/grub/grub.conf文件中行首的空白字符;
# sed 's@^[[:space:]]\{1,\}@@' /boot/grub/grub.conf
5.取出一个文件路径的目录名称,如/etc/sysconfig/network,其目录为/etc/sysconfig,功能类似dirname命令;
# echo /etc/sysconfig/network-scripts/ifcfg-eth0/ | sed 's@[^/]\{1,\}/\?$@@'
(以非斜杠开始,后面的斜杠可有可无,用空格替换)
4.awd
1、显示GID小于500的组;
# awk -F : '$3<500{print $1}' /etc/group
2.显示/etc/sysctl.conf文件中定义的内核参数;只显示名称;
3.显示eth0网卡的ip地址;通过ifconfig的命令结果进行过滤