目录
正则表达式的定义
- 正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,简单来说,是一种匹配字符串的方法,通过一些特殊符号,实现快速查找、删除、替换某个特定字符串。
- 正则表达式是由普通字符与元字符组成的文字模式。其中普通字符包括大小写字母、数字、标点符号及一些其他符号元字符则是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的学符)在自标对象中的出现模式。
正则表达式的用途
正则表达式对于系统管理员来说是非常重要的,系统运行过程中会产生大量的信息,这些信息有些是非常重要的,有些则仅是告知的信息。身为系统管理员如果直接看这么多的信息数据,无法快速定位到重要的信息,如“用户账号登录失败”“服务启动失败”等信息。这时可以通过正则表达式快速提取“有问题”的信息。如此一来,可以将运维工作变得更加简单、方便。
正则表达式的分类
正则表达式的字符串表达方法根据不同的严谨程度与功能分为基本正则表达式与扩展正则表达式。基础正则表达式是常用正则表达式最基础的部分。在 Linux系统中常见的文件处理工具中 grep与 sed_支持基础正则表达式,egrep 与awk支持扩展正则表达式。
正则表达式层次
- 基础正则表达式
- 扩展正则表达式
Linux中文本处理工具
- grep
- oegrep
- sed
- awk
基础正则表达式元字符
1、基础正则表达式是常用的正则表达式部分
2、除了普通字符外,常见到以下元字符
\:转义字符,\!、\n等
^:匹配字符串开始的位置
例:^a、^the、^#
$:匹配字符串结束的位置
例:word$
.:匹配除\n之外的任意的一个字符
例:go.d、g..d
*:匹配前面子表达式0次或者多次
例: goo*d、go.*d
[list]:匹配list列表中的一个字符
例: go[ola]d,[abc]、[a-z]、[a-zO-9]
[Alist]:匹配任意不在list列表中的一个字符
例: [Aa-z]、[^O-9]、[AA-ZO-9]
\[n,m\}:匹配前面的子表达式n到m次,有\{n\}、\{n,\}、\{n,m\}三种格式
例: go\{2\}d、go\{2,3\}d、go\{2,\}d
扩展元字符
+:匹配前面子表达式1次以上
例: go+d,将匹配至少一个o
?:匹配前面子表达式0次或者1次
例: go?d,将匹配gd或god
():将括号中的字符串作为一个整体
例:(xyz)+,将匹配xyz整体1次以上,如xyzxyz
|:以或的方式匹配字条串
例1: good|food,将匹配good或者food
例2: g(oolla)d,将匹配good或者glad
sed工具概述
文本处理工具,读取文本内容,根据指定的条件进行处理,如删除、替换、添加等
可在无交互的情况下实现相当复杂的文本处理操作
被广泛应用于Shell脚本,以完成自动化处理任务
sed依赖于正则表达式
工作原理
读取---------->执行------------>显示
sed命令常见用法
sed [选项] ‘操作’ 参数
sed [选项] -f scripfile 参数
选项的基本命令如下:
-e script :指定sed编辑命令
-f scriptfile :指定的文件中是sed编辑命令
-h :显示帮助
-n :表示仅显示处理后的结果
-i :直接编辑文本文件
操作的基本命令如下:
a :增加,在当前行下面增加一行指定内容
c :替换,将选定行替换为指定内容
d :删除,删除选定的行
i :插入,在选定行上面插入一行指定内容
p :打印
s :替换,替换指定字符
y :字符转换
输出符合条件的文本
1、输出第三行
sed -n ‘3p’ test.txt
2、输出第3-5行
sed -n ‘3,5p’ test.txt
3、输出所有奇数行
sed -n ‘p:n’ test.txt
4、输出所有偶数行
sed -n ‘n:p’ test.txt
5、输出第1-5行之间的奇数行
sed -n ‘1,5{p:n}’ test.txt
6、输出第10行之后的偶数行
sed -n ’10,${n:p}’ test.txt
7、输出包含the的行
sed -n ‘/the/p’ test.txt
8、输出从第4行的第一个包含the的行
sed -n ‘4,/the/p’ test.txt
9、输出以PI开头的行
sed -n ‘/^PI/p’ test.txt
10、输出以数字结尾的行
sed -n ‘/[0-9]$/p’ test.txt
11、输出包含wood的行
sed -n ‘/\<wood>/p’ test.txt
删除符合条件的文本
1、删除第3行
sed ‘3d’ test.txt
2、删除第3-5行
sed ‘3,5d’ test.txt
3、删除以小写字母开头的行
sed ‘/^[a-z]/d’ test.txt
替换符合条件的文本
1、将每行中的第一个the替换为THE
sed ‘s/the/THE/’ test.txt
2、将每行中的第2个l替换为L
sed ‘s/l/L/2’ test.txt
3、在包含the的每行行首插入#号
sed ‘/the/s//#/’ test.txt
4、在每行行尾插入字符串EOF
sed ‘s/$/EOF/’ test.txt
5、将第3-5行中的所有the替换为THE
sed ‘3,5s/the/THE/g’ test.txt
6、将包含the的所有行中的o替换为O
sed ‘/the/s/o/O/g’ test.txt
7、将文件中所有的o删除
sed ‘s/o//g’ test.txt
迁移符合条件的文本
H :复制到剪切板
g、G :将剪贴板中的数据覆盖/追加到指定行
w :保存为文件
r :读取指定文件
a :追加指定内容
1、将包含the的行迁移至文件末尾
sed ‘/the/{H;d};$G’ test.txt
2、将第1-5行内容转移至第17行后
sed ‘1,5{H’d};17G’ test.txt
3、将包含the的行号另存为文件out.file
sed ‘/the/w out.file’ test.txt
4、将文件/etc/hostname的内容添加到包含the的每行以后
sed ‘/the/r /etc/hostname’ test.txt
5、在第3行后插入一个新行,内容为NEW
sed ‘/the/3aNEW’ test.txt
6、在包含the的每行后插入一个新行,内容为NEW
sed ‘/the/aNEW’ test.txt
7、在第3行后插入多行内容,中间的\n表示换行
sed ‘3aNEW1\nNEW3’ test.txt
awk工具
awk是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,
对符合条件的内容进行格式的情况下实现想到哪复杂的文本操作
1、awk选项‘模式或条件 {编辑命令}’ 文件1 文件2 …
//过滤输出文件中符合条件的内容
2、awk -f 脚本文件 文件1 文件2…
//从脚本中调用编辑命令,过滤并输出内容
例:若需要查找出/etc/passwd的用户名,用户ID,组ID序列,执行以下awk命令
awk -F: ‘{print $1,$3,$4}’ /etc/passwd
awk包含几个特殊的内建变量如下所示:
FS :指定每行文本的字段分隔符,默认为空格或制表位
NF :当期处理的行的字段个数
NR :当前处理的行的行号
$0 :当前处理的行的整行内容
$n :当前处理的行的第n个字段
FILENAME :被处理的文件名
RS :数据记录分隔符,默认为\n,即每行为一条记录
按行输出文本
awk ‘{print}’ test.txt //输出所有内容,等同于cat test.txt
awk ‘{print $0}’ test.txt //输出所有内容
awk ‘NR==1,NR==3{print}’ test.txt //输出第1~3行内容
awk ‘(NR>=1)&&(NR<=3){print}’ test.txt //输出第1~3行内容
awk ‘NR==1 || NR==3{print}’ test.txt //输出第1行第3行内容
awk ‘(NR%2)==1{print}’ test.txt //输出奇数行内容
awk ‘(NR%2)==0{print}’ test.txt //输出偶数行内容
awk ‘/^root/{print}’ /etc/passwd //输出以root开头的行
awk ‘/nologin$/{print}’ /etc/passwd //输出以nologin结尾的行
awk ‘BEGIN {x=0};/\/bin\/bash$/{x++};END {printx}’ /etc/passwd
//统计以/bin/bash结尾的内容
awk ‘BEGIN{RS=””};END{print NR}’ test.txt //统计以空行分隔的文本段落数
按字段输出文本
awk ‘{print $3}’ test.txt //输出每行的第3个字段
awk ‘{print $1,$3}’ test.txt //输出每行的第1、3个字段
awk -F: ‘$2==””{print}’ /etc/shadow //输出密码为空的用户
awk ‘BEGIN {FS=”:”};$2==””{print}’ /etc/shadow //输出密码为空的用户
awk -F: ‘$7~”/bash”{print $1}’ /etc/passwd //输出以冒号分隔且第7个字段中包含/bash的行的第1个字段
awk -F: ‘($7!=”/bin/bash”)&&($7!=”/sbin/nologin”){print}}’ /etc/passwd //输出第7个字段即不为/bin/bash,也不为/sbin/nologin的所有行
awk ‘($1~”nfs”)&&(NF==8){print $1,$2}’ /etc/services //输出包含8个字段且第1个字段中包含nfs的行的第1、2个字段
通过管道、双引号调用shell命令
awk -F: ‘/bash$/{print | “wc -l”}’ /etc/passwd //调用wc -l命令统计使用bash的个数,等同于grep -c “bash$” /etc/passwd
awk ‘BEGIN {while (“w” | getline)n++;{print n-2}}’ //调用w命令,并用来统计在线用户数
awk ‘BEGIN {“hostname” | getline;print $0}’ //调用hostname,并输出当前的主机名
sort工具
sort命令的语法为sort [选项]参数,其中常见的选项包括以下几种
-f :忽略大小写
-b :忽略每行前面的空格
-M :按照月份进行排序
-n :按照数字进行排序
-r :反向排序
-u :等同于uniq,表示相同数据仅显示一行
-t :指定分隔符,默认使用[tab]键分隔
-o :将排序后的结果转存至指定行
-k :指定排序区域
示例1:将/etc/passwd文件中的账户进行排序
Sort /etc/passwd
示例2:将/etc/passwd文件中第三列进行反向排序
Sort -t “:” -k 3 /etc/passwd
uniq工具
-c :进行计数
-d :仅显示重复行
-u :仅显示出现一次的行
示例:查找testfile文件中的重复行
uniq -d testfile
tr工具
tr [选项] [参数]
-c :取代所有不属于第一字符集的字符
-d :删除所有属于第一字符集的字符
-s :把连续重复的字符以单独一个字符表示
-t :先删除第一字符集较第二字符集多出的字符
示例1:将输入字符有大写转换为小写
echo “KGC” | tr ‘A-Z’’a-z’
示例2:压缩输入中重复的字符
echo “this is a text linnnnne” | tr -s ‘sn’
示例3:删除字符串中某些字符
echo ‘helloworld’ | tr -d ‘od’