shell编写脚本

本文介绍了如何使用Shell脚本批量修改文件扩展名,包括基本脚本示例和改良版脚本的编写。此外,文章详细讲解了正则表达式的使用,通过多种实例展示了在文本操作中的应用,如查找特定模式的行、替换字符串等。最后提到了`sed`流式编辑器的用法,包括行选择、替换和删除,并给出了安装HTTPD服务并修改配置的脚本示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

shell   04

================================================

一,练习:编写脚本,实现批量修改文件扩展名

touch abc{01..10}.txt   //创建10个文件作为素材

vim test01.sh

#!/bin/bash

#批量修改扩展名

for i in $(ls *.txt)   //找到所有的txt文件交给for循环

do

    a=${i%.*}   //用去尾的方法删除扩展名

    mv $i $a.doc   //再将源文件修改为doc的

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 修改源文件

指令:

输出    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端口访问页面

 

--------------------------------------------------

练习:

1 简述grep工具的-q选项的含义(egrep同样适用)。

2 正则表达式中的+、?、*分别表示什么含义?

3 如何编写正则表达式匹配11位的手机号?

4 简述sed定址符的作用及表示方式。

 

 

参考答案:

1 简述grep工具的-q选项的含义(egrep同样适用)。

选项-q的作用是静默、无任何输出,效果类似于正常的grep操作添加了&> /dev/null来屏蔽输出

2 正则表达式中的+、?、*分别表示什么含义?

这三个字符用来限制前面的关键词的匹配次数,含义分别如下:

                                     +:最少匹配一次,比如a+可匹配a、aa、aaa等

                                     ?:最多匹配一次,比如a?可匹配零个或一个a

                                     *:匹配任意多次,比如a*可匹配零个或任意多个连续的a

3 如何编写正则表达式匹配11位的手机号?

准备测试文件:

                                     [root@svr5 ~]# cat tel.txt

                                     01012315

                                     137012345678

                                     13401234567

                                     10086

                                     18966677788

提取包含11位手机号的行:

                                     [root@svr5 ~]# egrep '^1[0-9]{10}$' tel.txt     //这里^代表以数字1开头,后面有10个数字作为结尾

                                     13401234567

                                     18966677788

4 简述sed定址符的作用及表示方式。

作用:定址符(执行指令的条件)控制sed需要处理文本的范围;不加则逐行处理所有行

表示方式:定址符可以使用行号或正则表达式

----------------------------------------------------------------------------

 

运维课程需要的环境

情况一:如果电脑是Windows的话:

创建虚拟机,用最小化方式安装,按要求配置好ip,同网段之间要能互通,配置好yum,修改主机名

proxy  192.168.2.5(vmnet2)  192.168.4.5(vmnet4)      //必须

web1  192.168.2.100(vmnet2)     //必须

web2  192.168.2.200(vmnet2)     //必须

client  192.168.4.10(vmnet4)      //可选,主要作为测试,如果没有该主机将来可以用真机测试

真机要安装火狐浏览器

上述需求可以参考视频:

链接:https://pan.baidu.com/s/1d8H9bqsJ83eQOSsvNeYWOA

提取码:11ie

 

情况二:如果电脑是Linux的话

在码云找 operation环境准备.docx 这个文档,里面有安装过程

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值