Shell脚本-正则表达式

1.正则表达式的定义:

正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,简单来说,是一种匹配字符串的方法,通过一些特殊符号,实现快速查找、删除、替换某个特定字符串。正则表达式是由普通字符与元字符组成的文字模式。其中普通字符包括大小写字母、数字、标点符号及一些其他符号,元字符则是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在自标对象中的出现模式。

2.正则表达式的用途:

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

3.正则表达式的分类

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

正则表达式定义

●正则表达式,又称正规表达式、常规表达式
●使用字符串来描述、匹配一系列符合某个规则的字符串
●正则表达式组成
◆普通字符.
大小写字母、数字、标点符号及一些其他符号
◆元字符
在正则表达式中具有特殊意义的专用字符

正则表达式层次

●基础正则表达式
●扩展正则表达式

Linux中文本处理工具

基础:
grep osed
扩列:
egrep awk

grep,sed,awk更是 Shell 编程中经常用到的文本处理工具,被称之为Shell编程三剑客。

基础正则表达式元字符

基础正则表达式是常用的正则表达式部
除了普通字符外,常见到以下元字符:

\:转义字符,\!,\n
^: 匹配字符串开始的位置  例: ^a,^the,^#
$: 匹配字符串结束的位置 例:word$
. : 匹配除\n之外的任意的一个字符 例如:go.d,g..d
* : 匹配前面子表达式0次或者多次   例:goo*d , go.*d
* [list] : 匹配list列表中的一个字符  例:go[ola]d,[abc],[a-z],[a-z0-9]
* [^list] :匹配任意不在list列表中的一个字符 例:[^a-z],[^0-9],[^A-Z0-9]
* \{n,m\} : 匹配前面的子表达式n到m次,有\{n\},\{n,\},\{n,m\}三种格式 例:go\{2\}d,go\{2,3\}d,go\{2,\}d

grep工具

-n   表示显示行号    
-i    表示不区分大小写  
-v   表示反向过滤   
[]   查找集合字符

grep用法示例:

grep root /etc/passwd  //筛选文件包含root的行
grep ^root /etc/passwd //筛选文件以root的行
grep -v root /etc/passwd //筛选文件以root的行
grep bash$ /etc/passwd //筛选文件以bash结尾的行
grep 'r..d' /etc/passwd //筛选r和d之间有两个字符的行
grep '[^s]bin' /etc/passwd //筛选文件以root的行
grep "^$" /etc/passwd //筛选空白行
grep '0\{1,\}' /etc/passwd //查找数字0出现1次及以上的行。
grep -e "ntp" -e "root"  /etc/passwd //-e 参数查找多个模式
grep [0-3] /etc/passwd //筛选包含数字0-3的行
grep '[^a-z]ae' /etc/passwd //筛选ae前面不是小写字母的字
grep 0* /etc/passwd //筛选匹配前面字表达式0次或者多次
grep 00* /etc/passwd //筛选匹配前面 必须包含一个0的行第二给出现0次或者多次

sed工具

sed (Strcam EDitor)是一个强大而简单的文本解析转换工具,可以读取义本,并根据指定的条件对义本内容进行编辑(删除、替换、添加、移动等),最后输出所有行或者仅输出处理的某些行。

sed的工作流程主要包括读取、执行和显示三个过程
读取: sed从输入流(文什、管道、标准输入)中读取一行内容并存储到临时的级冲区中(又称模式空间,pattern spacc)。执行:默认情况下,所有的sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则 sed 命令将会在所有的行上依次执行显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。注意:默认情况下所有的sed命令都是在模式空问内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。

sed命令常见用法
sed [选项] ‘操作’ 参数
sed [选项] -f scriptfile 参数

常见的sed命含选项主费包含以下几种
-e script:指定sed编辑命令
-f scriptfilc:指定的文件中是scd编辑命令h或help:显示帮助。
-n、–quiet或silent:表示仪显示处理后的结果。
-i:直接编辑文本文件。

常见的操作包括以下几种:

a:增加,在当前行上面增加一行指定内容。
c:替换,将选定行替换为指定内容。
d:删除,删除选定的行。
i:插入,在选定行上面插入行指定内容。
p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以ASCII码输出。其通常与“n”选项一起使用。
s:替换:替换指定字符。
y:字符转换。

Sed用法示例:

输出指定行:

sed -n 'p' /etc/passwd   //将所有内容输出
sed -n '6p' /etc/passwd   //将6行内容输出
sed -n '6,8p' /etc/passwd   //将6-8内容输出
sed -n 'p;n' /etc/passwd   //将输出所有奇数输出  nl /etc/passwd | sed -n 'p;n' 查看行号奇数
sed -n 'n;p' /etc/passwd   //将输出所有偶数输出  nl /etc/passwd | sed -n 'n;p'sed -n '1,10{n;p}' /etc/passwd //将输入1-10奇数输出  
 sed -n '1,10{p;n}' /etc/passwd //将输入1-10偶数输出   
sed -n '1,${p;n}' /etc/passwd //将输入10(不包括本身)后面的偶数输出   sed -n '/root/p' /etc/passwd  //将包含root的行输出
sed -n '/root\|ntp/p' /etc/passwd  //将包含root或者ntp的行输出   \|遇特殊字符 需要转义\。
sed -e '5q' /etc/passwd //输入前5行后退出 

插入符号条件的行

sed '/root/i admin' /etc/passwd //在含有root行前面加入admin
sed '/root/a admin' /etc/passwd //在含有root行后面加入admin
sed '3a nms' /etc/passwd //在第3行后加入nsm
sed '3i nms' /etc/passwd //在第3行前加入nsm
注:如要插入多行数据 ,除最后一行,每行都需要加"\n"换行

删除符号要求行

sed '1d' /etc/passwd //删除第一行
sed '$d' /etc/passwd //删除最后一行
sed '2,4d' /etc/passwd //删除2-4行
sed '/root/d' /etc/passwd //删除含有root的行
sed '/root/!d' /etc/passwd //删除不包含root的行 这里!表示取反操作

替换符合条件的文本

sed '/root/c admin' /etc/passwd //将含有root的行替换为admin
sed -n '/root/admin/2p' /etc/passwd //把每行的第2个root替换成admin
sed -n '/root/s/root/ROOT/g' /etc/passwd //将包含root的所有行中的root替换ROOT
sed '1,3s/bin/BIN/g' /etc/passwd //将第1-3行中的所有bin替换BIN
sed 's/$/ABC/' /etc/passwd //在每行行尾插入字符串ABC
sed ‘/root/s/^/#//etc/passwd //将包含root的行首插入#号
sed '1cABC' /etc/passwd //将第一行替换ABC
sed '1,10y/root/ROOT/' /etc/passwd //将1-10行中的root对应的替换ROOT

迁移符号条件的文本

sed '/root/w file1' /etc/passwd //将包含root的行另存file1
sed '/root/{H;d};$G' /etc/passwd //将包含root行迁移至末尾
sed '1,5{H;d};$G' /etc/passwd //将1-5行内容迁移至末尾
sed '/root/{H;d};$G' /etc/passwd //将包含root迁移至末尾

执行多次命令

sed -ne 's/root/admin' -ne 's/bash/sh/p' /etc/passwd //将root和bash运作替换

直接修改文件内容

sed -i 's/^/#/' /etc/passwd //每行开头插入#号,直接修改原文件
sed -i 's/^#//g' /etc/passwd //每行开头#号删除,直接修改原文件

扩展正则表达式元字符

grep命令仅支持基础正则表达式,如果使用扩展正则表达式,需要使用egrep或awk命令。扩展正则表达式是对基础正则表达式的扩充深化。
扩展元字符

+:匹配前面子表达式1次以上 例如:go+d,将匹配至少一个o
?:  匹配前面子表达式0次或者1次 例如:go?d,将匹配gd或god
(): 将括号中的字符串作为一个整体 例如:(xyz)+,将匹配xyz整体1一次以上,如xyzxyz
|: 以或的方式匹配字条串 例如1:good|food,将匹配good或者food  例如2:g(oo|la)d,将匹配good或者glad
()+: 辨别多个重复的组示例:“egrep -n 'A(xyz)+C' test.txt”。该命令是查询开头的"A"结尾是"c",中间有一个以上的"xyz"字符串意思。

awk工具

awk工具介绍
awk是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当复杂的文本操作,被广泛应用于 Shell 脚本,完成各种自动化配置任务

awk工作原理
逐行读取文本,默认以空格为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。
在这里插入图片描述
功能强大的编辑工具
无交互的情况下实现复杂的文本操作
常见命令格式用法:
awk 选项 ‘模式或条件 {编辑指令}’ 文件1 文件2
awk -f 脚本文件 文件1 文件2

awk包含几个特殊的内建变量(可直接用)如下所示:

FS:指定每行文本的字段分隔符,默认为空格或制表位。
NF:当前处理的行的字段个数。
NR:当前处理的行的行号序数)。
$0:当前处理的行的整行内容。
$n:_当前处理行的第n个宁段(第n列)。
FILENAME:被处理的文件名。
RS:数据记录分隔,默认为\n,即每行为一条记录。

awk用法示例:

按行输出文件

awk . {print}'test.txt //输出所有内容,等同于cat test.txt
awk ' lprint $0}’test.txt //输出所有内容,等同于cat 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 f{print}'  test.txt //输出第工行、第3行内容
awk '(NR%2)=1 (print)' test.txt //输出所有奇数行的内容
awk '(NR%2)==0{print}' test.txt //输出所有偶数行的内容
awk '/^root/{print}' /etc/passwd //输出以root并头的行
awk /nologin$/ fprint}' /etc/passwd //输出以nologin结尾的行
awk ' BEGIN{x=0};//bin/bash$/(x ++};END (print x]’/etc/passwd  //统计以/bin/bash 结尾的行数,等同于 grep -c "/bin/bash$" /etc/passwd
awk ' BEGIN {RS=""};END{print NR}'  test.ixt //统计以空行分隔的文本段落数

按字段输出文本

awk ' (print $3}' test.txt//输出每行中(以空格或制表位分隔)的第3个字段
awk ' (print,$1,$3}'  test.txt//输出每行中的第1、3个字段
awk -F ":" '$2=="!!" {print}' /etc/shadow //输出密码为空的用户的 shadow记录  :开头
awk ' BEGIN {FS=" :"}; $2=="!!"{print}'  /etc/ shadow //输出密码为空的用户的shadow记录 :开头
awk -F ":" '$7~"/bash" {print $1}' /etc/passwd//输出以冒号分隔且第7个字段中包含/bash的行的第1个字段注:~表示当前用户的意思。
awk '(S1~"nfs")&& (NF==8) {print $1, s2}' /etc/services //输出包含8个字段且第1个字段中包含nfs的行的第1、2个字段。
awk  -F ":" '($7!="/bin/bash")&&($7!="/sbin/nologin"){print}'  /etc/passwd //输出第7个字段既不为/bin/bash也不为/sbin/nologin的所有行

通过管道、双引号调用 Shell 命令

awk -F: '/bash$/ {print  "wc -l"i’/etc/passwd//调用 wc -l 命令统计使用bash 的用户个数,等同于 grep -c "bash$" /etc/passwd
awk ' BEGIN {(while ("w" | gctline) n++ ; {print n-2}}' //调用w命令,并用来统计在线用户数
awk ' { "hostname" | getline ; print $0}'  //调用 hostname,并输出当前的主机名

sort工具

依据不同的数据类型进行排序
默认:字符排序
数字排序
语法格式:

sort [选项]  参数

常用选项:

-f:忽略大小写。
-b:忽略每行前面的空格。
-M:按照月份进行排序。
-n:按照数字进行排序。
-r:反向排序。
-u:等同于uniq,表示相同的数据仅显示一行。
-t:指定分隔符,默认使用[Tab]键分隔。
-o<输出文件>:将排序后的结果转存至指定文件。
-k:指定排序区域。

sort用法示例:

示例1:sort /etc/passwd  //将/etc/passwd文件中的账号排序
示例2:sort -t “:-rk 3 /etc/passwd //将/etc/passwd文件中第三列进行反向排序
示例3:sort -t “:-k 3 /etc/passwd -o user.txt //将/etc/passwd文件中第三列进行排序,并将输出内容保存到user.txt

tr工具

tr 命令常用来对来自标准输入的字符进行替换、压缩和删除。
常用命令:


tr具体的命令语法格式为:
tr [选项]  [参数]其常用选项包括以下内容。
-c:取代所有不属于第一字符集的字符;
-d:删除所有属于第一字符集的字符;
-s:把连续重复的字符以单独一个字符表示;
-t:先删除第一字符集较第二字符集多出的字符,做替换

tr用法示例:

示例1:将输入字符由大写转换为小写。[root@localhost~]#echo "KGC" | tr 'A-Z’'a-z'
kgc
示例2:压缩输入中重复的字符。[root@localhost ]# echo "thissss is a text linnnnnnne." | tr -s 'sn'
this is a text line.
示例3:删除字符串中某些字符。[root@localhost ~]#echo 'hello world' | tr -d 'od'
hell wrl
示例4:取代所有不属于第一字符集的字符echo abccabacca | tr -c ab
oabooabaooao
示例5:先删除第一字符集较第二字符集多出的字符,做替换[root@server2~]#echo abcabc123 tr -t 'abc' 'd'
dbcdbc123
[root@server2 ~]#echo abcabc123 | tr -t 'abc''ttt'
tttttt123
[root@server2 ~]#echo abcabc123 | tr -t 'ab’ 'ttt'
ttcttc123

uniq 工具

Uniq工具在Linux系统中通常与 sort命令结合使用,用于报告或者忽略文件中的重复行。
常用命令:

-c:进行计数;
-d:仅显示重复行;
-u:仅显示出现一次的行。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值