首页 > 系统相关 >shell正则表达式、sed基本用法及sed应用案例

shell正则表达式、sed基本用法及sed应用案例

时间:2024-11-13 17:51:08浏览次数:3  
标签:bin test1 sbin shell 正则表达式 nologin sed adm root

一、正则表达式

可以使用若干符号配合某工具对字符串进行增删改查操作

1.1 基本正则列表

正则符号

描述

^

匹配行首

$

匹配行尾

[ ]

集合,匹配集合中任意单个字符

[ ^ ]

对集合取反

.

匹配任意字符

*

匹配前一个字符任意次数【*不允许单独使用】

\{n,m}

匹配前一个字符n到m次

\{n\}

匹配前一个字符n次

\{n,\}

匹配前一个字符n次以上

\(\)保留
^$空行

1.2 运用案列 

1.2.1 准备素材 

[root@test1 ~]# head -5 /etc/passwd > user  #准备素材

1.2.2 单符号匹配
[root@test1 ~]# grep ^root user    #找以root开头的行
root:x:0:0:root:/root:/bin/bash


[root@test1 ~]# grep bash$ user     #找以bash结尾的行
root:x:0:0:root:/root:/bin/bash


[root@test1 ~]# grep ^$ user   #找空行


[root@test1 ~]# grep -v ^$ user  #显示除了空行的内容
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
 1.2.3 集合符号运用
[root@test1 ~]# grep "[root]" user    #找r、o、t任意一个字符
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin


[root@test1 ~]# grep "[rot]" user    #效果同上
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin


[root@test1 ~]# grep "[^rot]" user   #显示r或o或t以外的内容
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin


[root@test1 ~]# grep "[0123456789]" user   #找所有数字
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin


[root@test1 ~]# grep "[0-9]" user    #效果同上
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin


[root@test1 ~]# grep "[^0-9]" user   #显示数字以外内容
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin


[root@test1 ~]# grep "[a-z]" user    #找所有小写字母
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin


[root@test1 ~]# grep "[a-Z]" user    #找所有字母
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin


[root@test1 ~]# grep "[^0-9a-Z]" user   #找所有符号
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
1.2.4 任意字符运用
[root@test1 ~]# grep "." user   #找任意单个字符,文档中每个字符都可以理解为任意字符
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin


[root@test1 ~]# grep "r..t" user  #找rt之间有2个任意字符的行
root:x:0:0:root:/root:/bin/bash


[root@test1 ~]# grep "r.t" user  #找rt之间有1个任意字符的行,没有匹配内容,就无输出


[root@test1 ~]# grep "*" user   #错误用法,*号是匹配前一个字符任意次,不能单独使用


[root@test1 ~]# grep "ro*t" user   #找rt,中间的o有没有都行,有几次都行
root:x:0:0:root:/root:/bin/bash


[root@test1 ~]# grep ".*" user  #找任意,包括空行 .与*的组合在正则中相当于通配符的效果
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
1.2.5 字符个数匹配
[root@test1 ~]# grep "ro\{1,2\}t" user  #找rt,中间的o可以有1~2个
root:x:0:0:root:/root:/bin/bash

[root@test1 ~]# grep "ro\{2,6\}t" user  #找rt,中间的o可以有2~6个
root:x:0:0:root:/root:/bin/bash

[root@test1 ~]# grep "ro\{1,\}t" user  #找rt,中间的o可以有1个以及1个以上
root:x:0:0:root:/root:/bin/bash

[root@test1 ~]# grep "ro\{3\}t" user   #找rt,中间的o必须只有有3个

1.3 扩展正则列表

正则符号

描述

+

最少匹配一次

最多匹配一次

{n,m}

匹配n到m次

()

组合为整数,保留

|

或者

\b

单词边界

提示:1.2案例的命令以上命令均可以加-E选项并且去掉所有\,改成扩展正则的用法,比如grep "ro\{1,\}t" user可以改成 grep -E "ro{1,}t" user或者egrep "ro{1,}t" user

1.4 案列运用

1.4.1 扩展正则符号使用
[root@test1 ~]# grep "ro\{1,\}t" user   #使用基本正则找o出现1次以及1次以上
root:x:0:0:root:/root:/bin/bash

[root@test1 ~]# egrep "ro{1,}t" user   #使用扩展正则,效果同上,比较精简
root:x:0:0:root:/root:/bin/bash

[root@test1 ~]# egrep "ro+t" user   #使用扩展正则,效果同上,最精简
root:x:0:0:root:/root:/bin/bash

[root@test1 ~]# grep "roo\{0,1\}t" user   #使用基本正则找第二个o出现0~1次
root:x:0:0:root:/root:/bin/bash

[root@test1 ~]# egrep "roo{0,1}t" user   #使用扩展正则,效果同上,比较精简
root:x:0:0:root:/root:/bin/bash

[root@test1 ~]# egrep "roo?t" user   #使用扩展正则,效果同上,最精简
root:x:0:0:root:/root:/bin/bash

[root@test1 ~]# egrep "(0:){2}" user  #找连续的2个0:  小括号的作用是将字符组合为一个整体
root:x:0:0:root:/root:/bin/bash

[root@test1 ~]# egrep "root|bin" user  #找有root或者bin的行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

二、sed 流式编辑器

可以对文档进行非交互式增删改查,逐行处理。

2.1 用法:

●前置指令 | sed  选项  条件  指令

●sed  选项  条件  指令  被处理文档

选项

符号

含义

-n

屏蔽默认输出

-r

支持扩展正则

-i

修改源文件

指令

符号

含义

p

输出

d

删除

s

   替换  

 2.2 语法演示

[root@test1 ~]# sed -n  'p'  user    #输出所有行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

[root@test1 ~]# sed -n  '1p'  user   #输出第1行
root:x:0:0:root:/root:/bin/bash

[root@test1 ~]# sed -n  '2p'  user   #输出第2行
bin:x:1:1:bin:/bin:/sbin/nologin

[root@test1 ~]# sed -n  '3p'  user    #输出第3行
daemon:x:2:2:daemon:/sbin:/sbin/nologin

[root@test1 ~]# sed -n  '2,4p'  user   #输出2~4行
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

[root@test1 ~]# sed -n  '2p;4p'  user   #输出第2行与第4行
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

[root@test1 ~]# sed -n '3,+1p' user   #输出第3行以及后面1行
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

[root@test1 ~]# sed -n '/^root/p' user   #输出以root开头的行  
root:x:0:0:root:/root:/bin/bash

[root@test1 ~]# sed -n '/root/p' user   #输出包含root的行
root:x:0:0:root:/root:/bin/bash

[root@test1 ~]# sed -nr '/^root|^bin/p' user   #输出以root开头的行或bin开头的行,|是扩展正则,需要r选项
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

[root@test1 ~]# sed -n '1!p' user   #输出除了第1行的内容,!是取反
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

[root@test1 ~]# sed -n '$p'  user  #输出最后一行
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

[root@test1 ~]# sed -n '='  user   #输出行号,如果是$=就是最后一行的行号以上操作,如果去掉-n,在将p指令改成d指令就是删除
1
2
3
4
5

2.3 实例运用

2.3.1 实例1

编写脚本,搭建httpd服务,用82号端口开启服务

[root@test1 ~]# vim httpd.sh
#!/bin/bash
setenforce 0   #关闭selinux
yum -y install httpd &> /dev/null     #安装网站
echo  "sed-test~~~" > /var/www/html/index.html    #定义默认页
sed  -i  '/^Listen  80/s/0/2/'  /etc/httpd/conf/httpd.conf   #修改配置文件,将监听端口修改为82
systemctl restart httpd   #开服务
systemctl enable httpd   #设置开机自启

[root@test1 ~]# chmod u+x httpd.sh #给执行权限
[root@test1 ~]# ./httpd.sh   #执行脚本
setenforce: SELinux is disabled
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

[root@test1 ~]# curl 10.100.10.175:82  #脚本运行之后,测试82端口
sed-test~~~
[root@test1 ~]# netstat -ntulp | grep httpd   #检查服务的端口是否为82
tcp6       0      0 :::82                   :::*                    LISTEN      18660/httpd  
2.3.2 实例2

编写脚本,找到系统使用bash的账户名,然后按照账户名 --> 密码” 的格式存储在一个文件中

[root@test1 ~]# vim yonghu.sh
#!/bin/bash
u=$(sed  -n  '/bash$/s/:.*#p'  /etc/passwd)  #找到passwd文档中以bash结尾的行,然后将行中冒号以及冒号后面内容都删除,此处的p代表仅仅显示s替换成功的行,最后赋值给u
for i in $u   #将那些用bash的账户名交给for循环
do
n=$(grep  $i:  /etc/shadow)   #用每个账户名去shadow中找对应信息
n=${n#*:}   #掐头,从左往右删除到第1个冒号
n=${n%%:*}   #去尾,从右往左删除到最后一个冒号经过上述步骤,n就是最终要的密码了
echo "$i --> $n"    #按格式喊出,如果要存到文件中就用追加重定向
done

[root@test1 ~]# chmod u+x yonghu.sh 
[root@test1 ~]# ./yonghu.sh

标签:bin,test1,sbin,shell,正则表达式,nologin,sed,adm,root
From: https://blog.csdn.net/bsqsb/article/details/143742954

相关文章

  • Python爬虫知识体系-----正则表达式-----持续更新
    数据科学、数据分析、人工智能必备知识汇总-----Python爬虫-----持续更新:https://blog.csdn.net/grd_java/article/details/140574349文章目录一、正则基础1.为什么使用正则2.正则与re模块简介二、正则表达式1.匹配单个字符与数字2.限定符3.定位符4.选择匹配符5.......
  • shell脚本30个案例(一)
    通过一个多月的shell学习,总共写出30个案例,分批次进行发布,这次总共发布了5个案例,希望能够对大家的学习和使用有所帮助,更多案例会在下一次进行发布。案例一、备份指定目录下的文件到另一个目录1.问题在服务器环境中,需要定期备份特定目录(如/var/www/html)中的文件到备份目录(如/b......
  • 2024 同一个网段,反弹shell四种方法【linux版本】bash、python、nc、villian反弹shell
    实验环境准备(同一个网段下,我是桥接的虚拟机)一、bash反弹shell二、python反弹shell三、nc反弹shell四、villain反弹shell实验环境准备(同一个网段下,我是桥接的虚拟机)      一台kali的linux(攻击者)        一台centos7/debian[另一个linux](受害者)一、b......
  • 使用 PowerShell 创建多个 .reg 文件进行分段(切片)并且能够在执行时按顺序合并并执行,我
    使用PowerShell创建多个.reg文件进行分段(切片)并且能够在执行时按顺序合并并执行,我们可以按照以下步骤进行:目标:将一个大的 .reg 文件分割成多个小文件。每个小文件(分段)都将是一个有效的 .reg 文件,可以独立执行。使用PowerShell自动生成这些分段 .reg 文件,并执行它......
  • 检查电脑的 .net framework 的版本(复制到powershell里执行)
    打开powershell,$release=Get-ItemPropertyValue-LiteralPath'HKLM:SOFTWARE\Microsoft\NETFrameworkSetup\NDP\v4\Full'-NameReleaseswitch($release){{$_-ge533320}{$version='4.8.1orlater';break}{$_-ge52......
  • A Method of Setting the LiDAR Field of View in NDT Relocation Based on ROI
    基于ROI的NDT重定位激光雷达视场设置方法期刊:MDPI单位:山东理工大学摘要:在高精度地图自动导航的重定位图中,激光雷达布放和视场选择起到检测车辆相对位置和位姿的作用。当激光雷达视场被遮挡或激光雷达位置错位时,很容易导致重定位丢失或重定位精度低。针对遮挡视场过大时ND......
  • 正则表达式re模块
    importre#正则表达式中的元字符:#“.”点通配符表示可以替换表达式中的任意字符,只能代指一个字符,除换行符外print(re.findall("a..","hdhgaqwe"))#“^”只从开始匹配print(re.findall("^a..","ahdhgaqwe"))#“$”只从结尾匹配print(re.findall("a..$","ahdh......
  • PowerShell 重命名文件夹及删除空文件夹
    数据来源$urldata中的倒数第2列(子文件夹名称列)包含/、\等特殊字符某个文件夹重命名脚本foreach($iin0..100){#提取路径部分$basePath=($urldata[$i].split("`t")[-1]).trim()$subPath=($urldata[$i].split("`t")[-2].replace('"','')......
  • LeetCode【0010】正则表达式匹配
    本文目录1中文题目2求解思路2.1基础解法:递归法2.2优化解法:动态规划和递归结合2.3最优解法:NFA(非确定性有限自动机)3题目总结1中文题目给一个字符串s和一个字符规律p,实现一个支持‘.’和‘*’的正则表达式匹配。‘.’匹配任意单个字符‘*’匹配零个或......
  • 《VATT: Transformers for Multimodal Self-Supervised Learning from Raw Video, Aud
    文章汉化系列目录文章目录文章汉化系列目录摘要1引言2相关工作2.1Vision中的Transformer2.2自监督学习3方法3.1标记化与位置编码3.1.1DropToken3.2Transformer架构3.3公共空间投影3.4多模态对比学习4实验4.1实验设置4.2结果4.2.1视频动作识别的微调4.2......