你不知道的正则表达式

 

 

1.1正则表达式:

是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,简单来说,是一种匹配字符串的方法,通过一些特殊符号,实现快速查找、删除、替换某个特定字符串。正则表达式是由普通字符与元字符组成的文字模式

1.2用途:

正在表达式对于系统管理员来说是非常重要的,系统运行过程中会产生大量的信息,这些信息有些事非常重要的,有些则只是告知的信息,身为系统管理员如果直接看这么多的信息数据,无法快速定位到重要的信息,如“用户登录失败”等信息,这是可以通过正则表达式快速提取有问题的信息,如此一来,可以将运维工作变得更佳简单、方便

1.3分类:

正则表达式的字符串表达方法根据不同的严谨程度与功能分为基本正则表达式与扩展正则表达式,基础正则表达式是常用正则表达式最基础的部分,再Linux系统中常见的文件处理工具中grep与sed支持基础正则表达式,而egrep与awk支持正则表达式。

二、基础正则表达式

grep的使用规则:
-n 表示显示行号
-I 表示不区分大小写
-v 表示过滤
[ ] 查找集合字符

2.1查找包含the的字符(准备一个查找文件)
grep -n ‘the’ test.txt

2.2不区分大小写查找包含the的字符
grep -in ‘the’ test.txt

2.3不查找包含the的字符
grep -vn ‘the’ test.txt

2.4利用中括号[ ]来查找集合字符
grep -n ‘sh[io]t’ test.txt

2.5查找包含重复单个字符oo时
grep -n ‘oo’ test.txt

2.6若查找oo前面不是w的字符串
grep -n ‘[^w]oo’ test.txt

2.7若不希望oo前面存在小写字母
grep -n ‘[^a-z]oo’ test.txt

2.8查询以小写字母开头的行
grep -n ‘1’ test.txt
2.9查询不以字母开头的行
grep -n ‘2’ text.txt
2.10查询以.结尾的行
grep -n ‘.$’ test.txt

2.11若想要查询oo、ooo、oooo等字符串,则需要使用星号()元字符等,o表示拥有零个或任意多个o字符,如果时“oo”,则第一个o必须存在,后面的o表示零个或任意多个o字符*
grep -n ‘ooo
’ test.txt

2.12查询以w开头d结尾,中间至少一个o
grep -n ‘woo*d’ test.tx

2.13查询以w开头d结尾,中间字符可有可无
grep -n ‘w.*d’ test.txt

2.14查询两个o的字符
grep -n ‘o{2}’ test.txt

2.15查询以w开头d结尾,中间包含两个及两个以上o
grep -n ‘wo{2,}d’ test.txt

三、基础正则表达式:元字符总结

^匹配输入字符串的开始位置,除非再方括号表达式中使用,表示不包含该字符集合
. 匹配除“ ”之处的任何单个字符
反斜杠,又叫转义字符,去除其后紧跟的元字符或通配符的特殊意义
* 匹配前面的子表达式零次或多次
[ ] 字符集合,匹配所包含的任意一个字符
[^] 赋值字符集合,匹配未包含的一个任意字符
[n1-n2] 字符范围,匹配指定范围内的任意一个字符
{n} n是一个非负整数,匹配确定的n次
{n,} n是一个非负整数,至少匹配n次
{n,m} m和n均为非负整数,其中n<=m,最少匹配n次最多匹配m次

四、sed命令常见用法

sed [选项] ‘操作’ 参数
sed [选项] -f scripfile 参数
选项的基本命令如下:
-e script :指定sed编辑命令
-f scriptfile :指定的文件中是sed编辑命令
-h :显示帮助
-n :表示仅显示处理后的结果
-i :直接编辑文本文件
操作的基本命令如下:
a :增加,在当前行下面增加一行指定内容
c :替换,将选定行替换为指定内容
d :删除,删除选定的行
i :插入,在选定行上面插入一行指定内容
p :打印
s :替换,替换指定字符
y :字符转换

4.1输出符合条件的文本
4.1.1输出第三行
sed -n ‘3p’ test.txt

4.1.2输出第3-5行
sed -n ‘3,5p’ test.txt

4.1.3输出所有奇数行
sed -n ‘p:n’ test.txt

4.1.4输出所有偶数行
sed -n ‘n:p’ test.txt

4.1.5输出第1-5行之间的奇数行
sed -n ‘1,5{p:n}’ test.txt

4.1.6输出第10行之后的偶数行
sed -n ’10,${n:p}’ test.txt

4.1.7输出包含the的行
sed -n ‘/the/p’ test.txt

4.1.8输出从第4行的第一个包含the的行
sed -n ‘4,/the/p’ test.txt

4.1.9输出以PI开头的行
sed -n ‘/^PI/p’ test.txt

4.1.10输出以数字结尾的行
sed -n ‘/[0-9]$/p’ test.txt

4.1.11输出包含wood的行
sed -n ‘/<wood>/p’ test.txt

4.2删除符合条件的文本
4.2.1删除第3行
sed ‘3d’ test.txt

4.2.2删除第3-5行
sed ‘3,5d’ test.txt

4.2.3删除以小写字母开头的行
sed ‘/3/d’ test.txt

4.3替换符合条件的文本
4.3.1将每行中的第一个the替换为THE
sed ‘s/the/THE/’ test.txt

4.3.2将每行中的第2个l替换为L
sed ‘s/l/L/2’ test.txt

4.3.3在包含the的每行行首插入#号
sed ‘/the/s//#/’ test.txt

4.3.4在每行行尾插入字符串EOF
sed ‘s/$/EOF/’ test.txt

4.3.5将第3-5行中的所有the替换为THE
sed ‘3,5s/the/THE/g’ test.txt

4.3.6将包含the的所有行中的o替换为O
sed ‘/the/s/o/O/g’ test.txt

4.3.7将文件中所有的o删除
sed ‘s/o//g’ test.txt

4.4迁移符合条件的文本
H :复制到剪切板
g、G :将剪贴板中的数据覆盖/追加到指定行
w :保存为文件
r :读取指定文件
a :追加指定内容

4.4.1将包含the的行迁移至文件末尾
sed ‘/the/{H;d};$G’ test.txt

4.4.2将第1-5行内容转移至第17行后
sed ‘1,5{H’d};17G’ test.txt

4.4.3将包含the的行号另存为文件out.file
sed ‘/the/w out.file’ test.txt

4.4.4将文件/etc/hostname的内容添加到包含the的每行以后
sed ‘/the/r /etc/hostname’ test.txt

4.4.5在第3行后插入一个新行,内容为NEW
sed ‘/the/3aNEW’ test.txt

4.4.6在包含the的每行后插入一个新行,内容为NEW
sed ‘/the/aNEW’ test.txt

4.4.7在第3行后插入多行内容,中间的 表示换行
Sed ‘3aNEW1 NEW3’ test.txt

五、awk工具

awk 选项 ‘模式或条件{编辑命令}’ 文件1 文件2…. //过滤并输出文件中符合条件的内容
awk -f 脚本文件 文件1 文件2… //从脚本中调用的编辑指令,过滤并输出内容

awk包含几个特殊的内建变量(可直接用)如下所示:
FS:指定每行文本的字段分隔符,默认为空格或制表位;
NF:当前处理的行的字段个数;
NR:当前处理的行的行号(序数);
$0:当前处理的行的整行内容;
$n:当前处理的行的第n个字段(第n列);
FILENAME:被处理的文件名;
RS:数据记录分隔,默认为 ,即每行为一条记录。

5.1、按行输出文本
5.1.1输出所有内容,等同于cat test.txt
awk ‘{print}’ test.txt

5.1.2输出所有内容,等同于cat test.txt
awk ‘{print $0}’ test.txt

5.1.3输出第1~3行内容
awk ‘NR1,NR3{print}’ test.txt

5.1.4输出第1~3行内容
awk ‘(NR>=1)&&(NR<=3){print}’ test.txt

5.1.5输出第1行,第3行的内容
awk ‘NR1||NR3{print}’ test.txt

5.1.6输出所有奇数行的内容
awk ‘(NR%2)==1{print}’ test.txt

5.1.7输出所有偶数行的内容
awk ‘(NR%2)==0{print}’ test.txt

5.1.8输出以root开头的行
awk ‘/^root/{print}’ /etc/passwd

5.1.9输出以nologin结尾的行
awk ‘/nologin$/{print}’ /etc/passwd

**5.1.10统计以/bin/bash结尾的行数,等同于grep –c “/bin/bashKaTeX parse error: Undefined control sequence: / at position 39: …‘BEGIN {x=0};/̲/̲bin/bash/{x++};END {print x}’ /etc/passwd

5.1.11统计以空行分隔的文本段落数
awk ‘BEGIN {RS=””} ;END{print NR}’ test.txt

5.2按字段输出文本
5.2.1输出每行中(以空格或制表符分隔)的第三个字段
awk ‘{print $3}’ test.txt

5.2.2输出每行中第1,3个字段
awk ‘{print $1,$3}’ test.txt

5.2.3输出密码为空的用户的shadow记录
awk -F ”:” ‘$2==””{print}’ /etc/shadow

5.2.4输出密码为空的用户的shadow记录
awk ‘BEGIN {FS=”:”} ; $2==””{print}’ /etc/shadow

5.2.5输出以冒号分隔且第7个字段中包含/bash的行的第一个字段
awk -F ”:” ‘$7~”/bash”{print $1}’ /etc/shadow

5.2.6输出包含8个字段且第一个字段中包含nfs的行的第1,2个字段
awk ‘($1~”nfs”)&&(NF==8){print $1,$2}’ /etc/services

5.2.7输出第七个字段既不为/bin/bash也不为/sbin/nologin的所有行
awk -F “:” ‘($7 != “/bin/bash”)&&($7 != “/sbin/nologin”){print}’ /etc/passwd

5.3通过管道、双引号调用Shell命令
5.3.1调用wc –l命令统计使用bash的用户的个数,等同于grep –c “bash$ ” /etc/passwd
awk -F: ‘/bash $/{print | “wc -l”}’ /etc/passwd

5.3.2调用w命令,并用来统计在线用户数
awk ‘BEGIN {while (“w” | getline) n++ ; {print n-2}}’

5.3.3.调用hostname,并输出当前主机名
awk ‘BEGIN {“hostname” | getline ; print $0}’

六、sort工具

sort是一种以行为单位对文件内容进行排序的工具,也可以根据不同的数据类型来排序

用法:sort命令的语法为“sort [选项] 参数”,其中常用的选项包括一下几种
-f:忽略大小写;
-b:忽略每行前面的空格;
-M:按照月份进行排序;
-n:按照数字进行排序;
-r:反向排序;
-u:等同于uniq,表示相同的数据仅显示一份;
-t:指定分隔符,默认使用[TAB]键分隔;
-o<输出文件>:将排序后的结果转存至指定文件;
-k:指定排序区域

七、uniq工具

uniq工具在Linux系统中通常与sort命令结合使用,用于报告或者忽略文件中的重复行
-c:进行计数;
-d:仅显示重复行;
-u:仅显示出现一次的行

八、tr工具

tr命令常用来对来自标准输入的字符进行替换、压缩和删除
tr具体的命令语法格式为:tr [选项] [参数]
-c:取代所有不属于第一字符集的字符;
-d:删除所有属于第一字符集的字符;
-s:把连续重复的字符以单独一个字符表示;
-t:先删除第一字符集较第二字符集多出的字符,做替换


  1. a-z ↩︎

  2. a-zA-Z ↩︎

  3. a-z ↩︎

原文地址:https://www.cnblogs.com/tianzhendengni/p/13827552.html