shell04(正则表达式,sed 流式编辑器)

7 篇文章 0 订阅

编写脚本,实现批量化修改拓展名

touchabc{1..10}.txt #创建10个文件

vim test01.sh

#!/bin/bash

#批量修改扩展名

fore i in $(ls .txt) #.txt改为$1 可以使用变量修改,(要修改的原名)

do

    a=${i%.*}

    mv $i $a.doc #doc改为$2 可以使用变量修改,(修改后的名字)

done

优化后为

#!/bin/bash

#批量修改扩展名

for i in $(ls *.$1)     //要改啥类型的文件用$1位置变量表示

do

    a=${i%.*}

    mv $i $a.$2   //要改成啥,用$2表示

done

 

 

定义变量初值(备用值)

${变量名:-初值}

#!/bin/bash

read -p "请输入要创建的账户名:"  u

useradd $u

read -p "请输入要配置的密码(默认123456):"  p   

echo ${p:-123456} | passwd --stdin $u     #如果没有输入密码直接回车的话密码就是123456

总结

${变量名:}   截取

${变量名/}   替换

${变量名#}   掐头

${变量名%}   去尾

${变量名:-}    定义初值(备用值)

 

 

正则表达式,使用若干符号配合某工具对文档进行增删改查等操作

head -5 /etc/passwd > user      #准备素材

grep ^root user    #找以root开头的行

grep bash$ user     #找以bash结尾的行

grep ^$ user         #找空行

grep -v ^$ user  #显示除了空行的内容

 

grep "[root]" user    #找rot任意一个字符

grep "[rot]" user    #效果同上

grep "[^rot]" user   #显示r或o或t以外的内容

grep "[0123456789]" user  #找所有数字

grep "[0-9]" user    #效果同上

grep "[^0-9]" user   #显示数字以外内容

grep "[a-z]" user   #找所有小写字母

grep "[A-Z]" user   #找所有大写字母

grep "[a-Z]" user    #找所有字母

grep "[a-Z0-9]" user   #找所有字母和数字

grep "[^a-Z0-9]" user  #找特殊符号

 

grep "." user   #找任意单个字符,文档中每个字符都可以理解为任意字符

grep "r..t" user  #找rt之间有2个任意字符的行

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

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

grep "ro*t" user  #找rt,中间的o有没有都行,有几次都行

grep ".*" user   #找任意,包括空行 .与*的组合在正则中相当于通配符的效果

 

grep "ro\{1,2\}t" user   #找rt,中间的o可以有1~2个

grep "ro\{2,6\}t" user    #找rt,中间的o可以有2~6个

grep "ro\{2,\}t" user    #找rt,中间的o可以有2个以及2个以上

grep "ro\{1,\}t" user     #找rt,中间的o可以有1个以及1个以上

grep "ro\{3,\}t" user    #找rt,中间的o可以有3个以及3个以上

grep "ro\{2\}t" user      #找rt,中间的o必须只有有2个

grep "ro\{1\}t" user       #找rt,中间的o必须只有有1个  

grep "ro\{3\}t" user        #找rt,中间的o必须只有有3个

 

grep "\(0:\)\{2\}" user      #找连续的2个0:  小括号的作用是将字符组合为一个整体

 

以上命令均可以加-E选项并且去掉所有\,改成扩展正则的用法,比如

grep "ro\{1,\}t" user可以改成 grep -E "ro{1,}t" user    

或者

egrep "ro{1,}t" user   

 

grep "ro\{1,\}t" user    #使用基本正则找o出现1次以及1次以上

egrep "ro{1,}t" user  #使用扩展正则,效果同上,比较精简

egrep "ro+t" user  #使用扩展正则,效果同上,最精简

grep "ro\{0,1\}t" user  #使用基本正则找o出现0~1次

egrep "ro{0,1}t" user  #使用扩展正则,效果同上,比较精简

egrep "ro?t" user  #使用扩展正则,效果同上,最精简

 

egrep "root|^bin" user   #找有root或者以bin开头的行

cat  aa     #素材文件,里面有一些"the"

the

there

the6

the_

123the

egrep "the\b" aa      #在aa文件中找the,右边不允许出现数字、字母、下划线

egrep "\bthe\b" aa  #找the,两边都不允许出现数字、字母、下划线

 

sed 流式编辑器,可以对文档进行非交互式增删改查的操作 逐行处理

用法1:前置命令 | sed  [选项]  '条件指令'

用法2:sed  [选项]  '条件指令'  文件.. ..

选项:

-n  屏蔽默认输出   -r  支持扩展正则  -i 修改源文件

指令:

p  输出    d  删除    s替换

sed -n 'p' user    #输出所有行

sed -n '1p' user   #输出第1行

sed -n '2p' user   #输出第2行

sed -n '3p' user   #输出第3行

sed -n '2,4p' user  #输出2~4行

sed -n '2p;4p' user   #输出第2行与第4行

sed -n '2,+1p' user  #输出第2行以及后面1行

sed -n '/^root/p' user  #输出以root开头的行  

sed -n '/root/p' user   #输出包含root的行

sed -nr '/^root|^bin/p' user

将以上语句中的p指令改为d指令可以实现对应行的删除效果比如sed -n '2p' user 改成 sed '2d' user  是删除第2行

sed -n '2!p' user   #输出除了第2行的内容,加!是取反效果

sed '3,+1!d' user     #删除第3行、第4行以外的行

sed -n '=' user      #显示行号,=号在sed中可以显示行号

sed -n '$=' user   #查看文档最后一行的行号,相当于查看文档总行数

 

sed -i '$d' user   #删除文档的最后一行并保存

 

sed 's/2017/6666/' test.txt   #把所有行的第1个2017替换成6666

sed 's/2017/6666/2' test.txt  #把所有行的第2个2017替换成6666

sed '1s/2017/6666/' test.txt  #把第1行的第1个2017替换成6666

sed '3s/2017/6666/3' test.txt  #把第3行的第3个2017替换成6666

sed '3s/2017//3' test.txt         #把第3行的第3个2017替换成空,相当于删除

sed '/2024/s/2017/6666/' test.txt  #找到有2024的行,将2017替换成6666

 

尝试将user文档中/bin/bash替换成/sbin/sh

sed '1s//bin/bash//sbin/sh/' user  #直接替换,报错

sed '1s/\/bin\/bash/\/sbin\/sh/' user  #使用转义符号可以成功,但不方便

sed '1s!/bin/bash!/sbin/sh!' user  #最佳方案,更改s的替换符

sed '1s@/bin/bash@/sbin/sh@' user  #替换符号可以用所有数字键上的

 

 

编写脚本,安装httpd服务,需要使用82号端口开启

#!/bin/bash

yum -y install httpd &> /dev/null

sed -i '/^Listen 80$/s/0/2/' /etc/httpd/conf/httpd.conf   #将以Listen 80开头的行的0换成2

systemctl restart httpd

systemctl enable httpd

 

echo "web-test~~~"  >  /var/www/html/index.html

setenforce 0            #执行完脚本后,关闭selinux

systemctl stop firewalld  #关闭防火墙

curl 192.168.4.7:82     #测试82端口访问页面

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值