sed基本用法

2021-12-05 23:41:06 浏览数 (1)

一,变量中字符串的处理

编写脚本,可以实现批量修改文件扩展名

代码语言:txt复制
#!/bin/bash
代码语言:txt复制
#批量修改扩展名
代码语言:txt复制
touch abc{1..10}.txt
代码语言:txt复制
for i in $(ls *.txt)   //找到所有的txt文件交给for循环
代码语言:txt复制
do
代码语言:txt复制
    n=${i%.*}   //用去尾的方法删除扩展名
代码语言:txt复制
    mv $i $n.doc   //再将源文件扩展名修改为doc
代码语言:txt复制
done

改良版:

代码语言:txt复制
#!/bin/bash
代码语言:txt复制
for i in $(ls *.$1)    //要改什么类型的文件用$1位置变量表示
代码语言:txt复制
do
代码语言:txt复制
    n=${i%.*}
代码语言:txt复制
    mv $i $n.$2   //要改成什么类型,用$2表示
代码语言:txt复制
done

定义变量初值(备用值)

${变量名:-初值}

${变量名:} 截取

${变量名/} 替换

${变量名#} 掐头

${变量名%} 去尾

${变量名:-} 定义初值

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

代码语言:txt复制
head -5 /etc/passwd > user      //准备素材
代码语言:txt复制
grep ^root user    //找以root开头的行
代码语言:txt复制
grep bash$ user     //找以bash结尾的行
代码语言:txt复制
grep ^$ user   //找空行
代码语言:txt复制
grep -v ^$ user  //显示除了空行的内容
代码语言:txt复制
grep "[root]" user    //找rot任意一个字符 
代码语言:txt复制
grep "[rot]" user    //效果同上
代码语言:txt复制
grep "[^rot]" user   //显示r或o或t以外的内容
代码语言:txt复制
grep "[0123456789]" user   //找所有数字
代码语言:txt复制
grep "[0-9]" user    //效果同上
代码语言:txt复制
grep "[^0-9]" user   //显示数字以外内容
代码语言:txt复制
grep "[a-z]" user    //找所有小写字母
代码语言:txt复制
grep "[A-Z]" user    //找所有大写字母
代码语言:txt复制
grep "[a-Z]" user    //找所有字母
代码语言:txt复制
grep "." user   //找任意单个字符,文档中每个字符都可以理解为任意字符
代码语言:txt复制
grep "r..t" user  //找rt之间有2个任意字符的行
代码语言:txt复制
grep "r.t" user  //找rt之间有1个任意字符的行,没有匹配内容,就无输出
代码语言:txt复制
grep "*" user   //错误用法,*号是匹配前一个字符任意次,不能单独使用
代码语言:txt复制
grep "ro*t" user   //找rt,中间的o有没有都行,有几次都行
代码语言:txt复制
grep ".*" user  //找任意,包括空行 .与*的组合在正则中相当于通配符的效果
代码语言:txt复制
grep "ro{1,2}t" user  //找rt,中间的o可以有1~2个
代码语言:txt复制
grep "ro{2,6}t" user  //找rt,中间的o可以有2~6个
代码语言:txt复制
grep "ro{1,}t" user  //找rt,中间的o可以有1个以及1个以上
代码语言:txt复制
grep "ro{3}t" user   //找rt,中间的o必须只有有3个
代码语言:txt复制
grep "(0:){2}" user  //找连续的2个0:  小括号的作用是将字符组合为一个整体

图片2.png

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

代码语言:txt复制
grep "ro{1,}t" user可以改成 grep -E "ro{1,}t" user    

或者

代码语言:txt复制
egrep "ro{1,}t" user   
代码语言:txt复制
grep "ro{1,}t" user   //使用基本正则找o出现1次以及1次以上
代码语言:txt复制
egrep "ro{1,}t" user   //使用扩展正则,效果同上,比较精简
代码语言:txt复制
egrep "ro t" user   //使用扩展正则,效果同上,最精简
代码语言:txt复制
grep "roo{0,1}t" user   //使用基本正则找第二个o出现0~1次
代码语言:txt复制
egrep "roo{0,1}t" user   //使用扩展正则,效果同上,比较精简
代码语言:txt复制
egrep "roo?t" user   //使用扩展正则,效果同上,最精简
代码语言:txt复制
[root@svr7 opt]# cat abc.txt    //准备文档素材,里面有一些带the的行
代码语言:txt复制
the
代码语言:txt复制
there
代码语言:txt复制
6the_
代码语言:txt复制
the#
代码语言:txt复制
abthe
代码语言:txt复制
egrep  "theb" abc.txt   //在abc.txt文件中找the,右边不允许出现数字、字母、下划线
代码语言:txt复制
egrep  "btheb" abc.txt   //两边都不允许出现数字、字母、下划线
代码语言:txt复制
egrep  "<the>" abc.txt   //效果同上
代码语言:txt复制
egrep "^root|^bin" user  //找以root或者以bin开头的行

三,sed

对文档非交互式增删改查 : 逐行处理

用法:

1, 前置指令 | sed 选项 条件 指令

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

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

指令: p 输出 d 删除 s 替换

代码语言:txt复制
sed -n 'p' user    //输出所有行
代码语言:txt复制
sed -n '1p' user   //输出第1行
代码语言:txt复制
sed -n '2p' user   //输出第2行
代码语言:txt复制
sed -n '3p' user    //输出第3行
代码语言:txt复制
sed -n '2,4p' user   //输出2~4行
代码语言:txt复制
sed -n '2p;4p' user   //输出第2行与第4行
代码语言:txt复制
sed -n '2, 1p' user   //输出第2行以及后面1行
代码语言:txt复制
sed -n '/^root/p' user   //输出以root开头的行  
代码语言:txt复制
sed -n '/root/p' user   //输出包含root的行
代码语言:txt复制
sed -nr '/^root|^bin/p' user   //输出以root开头的行或bin开头的行
代码语言:txt复制
sed -n '1!p' user   //输出除了第1行的内容
代码语言:txt复制
sed -n '$p' user   //输出最后一行
代码语言:txt复制
sed -n '$=' user   //输出最后一行的行号
代码语言:txt复制
sed 's/2017/6666/' test.txt   //把所有行的第1个2017替换成6666
代码语言:txt复制
sed 's/2017/6666/2' test.txt  //把所有行的第2个2017替换成6666
代码语言:txt复制
sed '1s/2017/6666/' test.txt  //把第1行的第1个2017替换成6666
代码语言:txt复制
sed '3s/2017/6666/3' test.txt  //把第3行的第3个2017替换成6666
代码语言:txt复制
sed '3s/2017//3' test.txt  //把第3行的第3个2017替换成空,相当于删除
代码语言:txt复制
sed '/2024/s/2017/6666/' test.txt  //找到有2024的行,将2017替换成6666
代码语言:txt复制
sed 's/2017/6666/g' test.txt   //替换所有行的所有2017为6666
代码语言:txt复制
/bin/bash  改成  /sbin/sh
代码语言:txt复制
sed 's//bin/bash//sbin/sh/' user     //直接替换,报错
代码语言:txt复制
sed 's//bin/bash//sbin/sh/' user   //使用转义符号可以成功,但不方便
代码语言:txt复制
sed 's!/bin/bash!/sbin/sh!' user   //最佳方案,更改s的替换符
代码语言:txt复制
sed 's(/bin/bash(/sbin/sh(' user   //替换符号可以用所有数字键上的

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

以下三个方式都可以替换

代码语言:txt复制
sed -i  ‘/^Listen 80/s/0/2/’  /etc/httpd/conf/httpd.conf
代码语言:txt复制
sed -i  ‘42s/0/2/’  /etc/httpd/conf/httpd.conf
代码语言:txt复制
sed -i  ‘s/Listen 80/Listen 82/’  /etc/httpd/conf/httpd.conf
代码语言:txt复制
#!/bin/bash
代码语言:txt复制
yum -y install httpd &> /dev/null
代码语言:txt复制
sed -i '/^Listen 80/s/0/2/' /etc/httpd/conf/httpd.conf
代码语言:txt复制
systemctl restart httpd
代码语言:txt复制
systemctl enable httpd
代码语言:txt复制
echo "web-test~~~"  > /var/www/html/index.html
代码语言:txt复制
setenforce 0  //脚本执行前要关闭selinux
代码语言:txt复制
curl 192.168.4.7:82  //测试82端口访问页面

编写脚本,找到系统使用bash的账户名,然后按照

“ 用户名 -- > 密码 ” 的格式存储在一个文件中

以下两种方法都可以找到使用bash的用户名

代码语言:txt复制
sed -n '/bash$/p' /etc/passwd | sed 's/:.*//'
代码语言:txt复制
sed -n '/bash$/s/:.*//p' /etc/passwd
代码语言:txt复制
#!/bin/bash
代码语言:txt复制
u=$(sed -n '/bash$/p' /etc/passwd | sed 's/:.*//')    //使用sed找到使用bash的用户,然后用替换功能删除无用信息只留下名字,再赋值给变量u
代码语言:txt复制
for i in $u   //将这些用户名交给循环处理
代码语言:txt复制
do
代码语言:txt复制
n=$(grep $i /etc/shadow)   //按照不同用户名找密码信息
代码语言:txt复制
n1=${n#*:}           //掐头
代码语言:txt复制
n2=${n1%%:*}   //去尾,留下纯粹的密码
代码语言:txt复制
echo "$i --> $n2"  >>  a.txt   //按格式追加重定向到a.txt文件
代码语言:txt复制
done

运维课程需要的环境

情况一:如果电脑是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 这个文档,里面有安装过程

练习:

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 '^10-9{10}$' tel.txt //这里^代表以数字1开头,后面有10个数字作为结尾

13401234567

18966677788

4 简述sed条件的作用及表示方式。

作用:条件控制sed需要处理文本的范围,不加则逐行处理所有行

表示方式:条件可以使用行号或正则表达式

0 人点赞