Shell之正则表达式三剑客

一、正则表达式

正则表达式:

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

用途:

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

分类:

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

二、基础正则表达式

grep的使用规则:

-n表示显示行号
-I表示不区分大小写
-v表示过滤
[ ]查找集合字符
查找包含the的字符(准备一个查找文件)
grep  -n  ‘the’  test.txt
不区分大小写查找包含the的字符
grep  -in  ‘the’  test.txt
不查找包含the的字符
grep  -vn  ‘the’  test.txt
利用中括号[ ]来查找集合字符
grep  -n  ‘sh[io]t’  test.txt
查找包含重复单个字符oo时
grep  -n  ‘oo’  test.txt
若查找oo前面不是w的字符串
grep  -n  ‘[^w]oo’  test.txt
若不希望oo前面存在小写字母
grep  -n  ‘[^a-z]oo’  test.txt
查询以小写字母开头的行
   grep  -n  ‘^[a-z]’  test.txt
查询不以字母开头的行
   grep  -n  ‘^[a-zA-Z]’  text.txt
查询以.结尾的行
   grep  -n  ‘\.$’  test.txt
若想要查询oo、ooo、oooo等字符串,则需要使用星号()元字符等,o表示拥有零个或任意多个o字符,如果时“oo*”,则第一个o必须存在,后面的o*表示零个或任意多个o字符
   grep  -n  ‘ooo*’  test.txt
查询以w开头d结尾,中间至少一个o
   grep  -n  ‘woo*d’  test.tx
查询以w开头d结尾,中间字符可有可无
   grep  -n  ‘w.*d’  test.txt
查询两个o的字符
   grep  -n  ‘o\{2\}’  test.txt
查询以w开头d结尾,中间包含两个及两个以上o
   grep  -n  ‘wo\{2,\}d’  test.txt

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

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

四、sed命令常见用法

Sed [选项] ‘操作’ 参数

Sed [选项] -f scripfile 参数

选项的基本命令如下:

-e script bn指定sed编辑命令
-f scriptfile指定的文件中是sed编辑命令
-h显示帮助
-n表示仅显示处理后的结果
-i直接编辑文本文件

操作的基本命令如下:

a增加,在当前行下面增加一行指定内容
c替换,将选定行替换为指定内容
d删除,删除选定的行
i插入,在选定行上面插入一行指定内容
p打印
s替换,替换指定字符
y字符转换

4.1、输出符合条件的文本

输出第三行
sed  -n  ‘3p’  test.txt
输出第3-5行
sed  -n  ‘3,5p’  test.txt
输出所有奇数行
sed  -n  ‘p:n’  test.txt
输出所有偶数行
sed  -n  ‘n:p’  test.txt
输出第1-5行之间的奇数行
sed  -n  ‘1,5{p:n}’  test.txt
输出第10行之后的偶数行
sed  -n  ’10,${n:p}’  test.txt
输出包含the的行
sed  -n  ‘/the/p’  test.txt
输出从第4行的第一个包含the的行
sed  -n  ‘4,/the/p’  test.txt
输出以PI开头的行
sed  -n  ‘/^PI/p’  test.txt
输出以数字结尾的行
sed  -n  ‘/[0-9]$/p’  test.txt
输出包含wood的行
sed  -n  ‘/\<wood>/p’  test.txt

4.2、删除符合条件的文本

删除第3行
sed  ‘3d’  test.txt
删除第3-5行
sed  ‘3,5d’  test.txt
删除以小写字母开头的行
sed  ‘/^[a-z]/d’  test.txt

4.3、替换符合条件的文本

将每行中的第一个the替换为THE
sed  ‘s/the/THE/’  test.txt
将每行中的第2个l替换为L
sed  ‘s/l/L/2’  test.txt
在包含the的每行行首插入#号
sed  ‘/the/s//#/’  test.txt
在每行行尾插入字符串EOF
sed  ‘s/$/EOF/’  test.txt
将第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
将文件中所有的o删除
sed  ‘s/o//g’  test.txt

4.4、迁移符合条件的文本

H复制到剪切板
g、G将剪贴板中的数据覆盖/追加到指定行
w保存为文件
r读取指定文件
a追加指定内容
将包含the的行迁移至文件末尾
sed  ‘/the/{H;d};$G’  test.txt
将第1-5行内容转移至第17行后
sed  ‘1,5{H’d};17G’  test.txt
将包含the的行号另存为文件out.file
sed  ‘/the/w  out.file’  test.txt
将文件/etc/hostname的内容添加到包含the的每行以后
sed  ‘/the/r  /etc/hostname’  test.txt
在第3行后插入一个新行,内容为NEW
sed  ‘/the/3aNEW’  test.txt
在包含the的每行后插入一个新行,内容为NEW
sed  ‘/the/aNEW’  test.txt
在第3行后插入多行内容,中间的\n表示换行
Sed  ‘3aNEW1\nNEW3’  test.txt

五、扩展正则表达式-元字符总结

grep命令仅支持基础正则表达式,如果使用扩展正则表达式,需要使用egrep或awk命令

+重复一个或者一个以上的前一个字符
零个或者一个的前一个字符
使用或者(or)的方式找出多个字符
( )查找“组“字符串
( ) +辨别多个重复的组

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

六、awk工具

6.1、awk是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,

对符合条件的内容进行格式的情况下实现想到哪复杂的文本操作

awk选项‘模式或条件 {编辑命令}’ 文件1 文件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,即每行为一条记录

6.2、用法示例

按行输出文本
awk ‘{print}’ test.txt//输出所有内容,等同于cat test.txt
awk ‘{print $0}’ test.txt//输出所有内容
awk ‘NR1,NR3{print}’ test.txt//输出第1~3行内容
awk ‘(NR>=1)&&(NR<=3){print}’ test.txt//输出第1~3行内容
awk ‘NR1 NR3{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,并输出当前的主机名

脚本实验:在apache网站站点里面创建十个网页,名字自拟,每个网页内容事web1、web2…

vim  web.sh
#!/bin/bash
网页创建
dir=/var/www/html
test=web
for  ((i=1;i<=10;i++))
do
cd  $dir
if  [  !  -e  index$i.html  ]
then  echo  $test$i > index$i.html
fi
done
systemctl  start  httpd
netstat  -anpt  |  grep  httpd
for  ((i=1;i<=10;i++))
do
   curl  http://localhost/index$i.html
done

七、在Linux中,常用的文件排序工具有三种:sort、uniq和tr

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’
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值