字符串的初值 正则表达式 sed应用

目录

字符串的初值(备用值)

正则表达式

基础正则列表 

扩展正则列表

基本正则: 

 扩展正则egrep:

基本元字符

{}限定次数 

其他元字符

整体及边界匹配

sed基本用法

sed命令

命令格式

常见的命令选项

常用动作指令

 输出文本

删除文本

替换文本

如何把/bin/bash换成/sbin/sh?

sed替换应用

编写脚本,搭建ftp服务,并且实现匿名上传功能

sed的文本块处理动作

a行后追加练习

i行前追加练习

c替换练习

sed高级应用

导入导出操作

!取反操作

sed综合脚本应用



字符串的初值(备用值)

  • 使用${}表达式,格式:  ${变量名:-(备用值)}      变量为非空值时不能使用
[root@server0 ~]# vim 01.sh
#!/bin/bash
read -p "请输入用户名  " m
useradd  $m
read -p  "请输入密码"  p                        #用户不输入密码直接回车时使用
echo  ${p:-123456}  |  passwd  --stdin  $m     #123456作为用户的密码
[root@server0 ~]# bash 01.sh
请输入用户名  hsjdh
请输入密码   
更改用户 hsjdh 的密码 。
passwd:所有的身份验证令牌已经成功更新。


正则表达式

可以配合某工具对文档进行过滤筛选

  • 基础正则列表 

正则符号 描述
^ 匹配行首
$ 匹配行尾
[ ] 集合,匹配集合中任意单个字符
[ ^ ] 对集合进行取反
. 匹配任意单个字符
* 匹配前一个字符任意次数     (*不允许单独使用)
\{n,m\} 匹配前一个字符n到m次
\{n\}

                                                                          匹配前一个字符n次

\{n,\} 匹配前一个字符n次及以上
\( \ ) 保留,组合成一个整体
  • 扩展正则列表

正则符号 描述
+ 最少匹配一次
? 最多匹配行首
{n,m} 匹配n到m次
( )  组合为整体,保留,相当于复制
| 或者
\b 单词边界

准备素材: 

[root@server0 ~]# head  -5  /etc/passwd  > user
[root@server0 ~]# cat 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@server0 ~]# head -5 /etc/passwd > /mnt/test   ##以test为素材
[root@server0 ~]# cat test
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@server0 ~]# grep root test   ##查找有root的行
root:x:0:0:root:/root:/bin/bash
[root@server0 ~]# grep ^root test   ##查找以root开头的行
root:x:0:0:root:/root:/bin/bash
[root@server0 ~]# grep bash$ test   ##查找以bash结尾的行
root:x:0:0:root:/root:/bin/bash
[root@server0 ~]# grep "[ro]" test   ##查找字母r或者o的行
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@server0 ~]# grep "[a-z]" test   ##查找所有小写字母
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@server0 ~]# grep "[A-Z]" test    ##查找所有大写字母 素材内无大写所以无匹配.
[root@server0 ~]# grep "[0-9]" test    ##查找所有数字
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@server0 ~]# grep "[a-Z]" test      ##查找所有字母
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@server0 ~]# grep "[^ro]" test     ##查找r或者o之外的内容
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@server0 ~]# grep "[^0-9]" test      ##查找数字之外的内容
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@server0 ~]# vim  test          ##给test文件添加几行,包括空格及空行
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
rt
rot
roooooooot
rooot
 
 
[root@server0 ~]# grep  "." test   ##查找任意字符,发现空格也匹配
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
rt
rot
roooooooot
rooot
 
[root@server0 ~]# grep  ".*" test  ##查找任意字符,发现空格及空行也匹配
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
rt
rot
roooooooot
rooot
 
 
[root@server0 ~]# grep  "roo." test   ##找root后面任意1个字符的行
root:x:0:0:root:/root:/bin/bash
roooooooot
rooot
[root@server0 ~]# grep  "ro.." test   ##找ro后面任意2个字符的行
root:x:0:0:root:/root:/bin/bash
roooooooot
rooot
[root@server0 ~]# grep  "r..." test   ##找r后面任意3个字符的行
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
roooooooot
rooot
[root@server0 ~]# grep "ro*t" test    ##查找rot,其中字母o可以出现任意次,零次也行
root:x:0:0:root:/root:/bin/bash
rt
rot
roooooooot
rooot
[root@server0 ~]# grep "ro\{1,2\}t" test  ##o出现了1~2次
root:x:0:0:root:/root:/bin/bash
rot
[root@server0 ~]# grep "ro\{3,5\}t" test  ##o出现了3~5次
rooot
[root@server0 ~]# grep "ro\{3,8\}t" test  ##出现了3~8次
rooooooooto
rooot
[root@server0 ~]# grep "ro\{1,8\}t" test   ##出现了1~8次
root:x:0:0:root:/root:/bin/bash
rot
roooooooot
rooot
[root@server0 ~]# grep "ro\{2\}t" test   ##o出现了2次
root:x:0:0:root:/root:/bin/bash
[root@server0 ~]# grep "ro\{2,\}t" test  ##o出现了2次及3次以上
root:x:0:0:root:/root:/bin/bash
roooooooot
rooot
[root@server0 ~]# grep "ro\{3,\}t" test   ##o出现了3次及3次以上
roooooooot
rooot
[root@server0 ~]# grep  "\(0:\)\{2\}" test  ##查找0:0:
root:x:0:0:root:/root:/bin/bash

 扩展正则egrep:

  • 文本处理顺序:
  1. 以行为单位,逐行进行处理
  2. 默认只输出与表达式相匹配的文本行
  • 基本用法:   等同于grep  -E ,表示允许使用扩展的正则表达式
  1. 格式1:egrep   [选项]   "正则表达式"   文件...
  2. 格式2:  前置命令  | egrep   [选项]   "正则表达式"
常用选项 作用
-i 忽略字母大小写
-v 条件取反
-c 统计匹配的行数
-q 静默,无任何输出,一般用于检测
-n 显示出匹配结果所在的行号
--color 标红显示匹配字串

基本元字符

类型  含义 示例 说明

 
匹配行首 ^abc 以abc开头的行
^#   以#开头的行(比如注释行)
$
 
匹配行尾 abc$ 以abc结尾的行
^$ 空行
. 单个字符 .   除换行符(\n)以外的任意单个字符

 
最少匹配一次 a+   一个或多个连续的a

    (abc)+           

一个或多个连续的abc
 ?      
 
最多匹配一次    a?    

                                                 0个或1个a

(abc)? 0个或1个abc
* 匹配任意次数 a*  0个或多个连续的a
(abc)*  0个或多个连续的abc
*   任意长度的任意字符串

{}限定次数 

类型 含义 示例 说明
{n} 匹配n次 (ab){3} 匹配ababab
{n,m} 匹配n-m次 (ab){1,3} 匹配ab,abab,ababab
{n,} 匹配至少n次 (ab){2,} 匹配2个及以上连续的ab

其他元字符

示例  说明
[alc45_?] 匹配a,l,c,4,5,_,?
[a-z] 匹配任意小写字母
[A-Z] 匹配任意大写字母
[0-9] 匹配任意数字
[a-Z0-9] 匹配任意字母或数字
[^A-Z] 匹配包括非大写字母的行
^[^a-z] 匹配不以小写字母开头的行

整体及边界匹配

类型 含义 示例 说明
() 组合为整体 ab{1,3} 匹配ab,abb,abbb
(ab){1,3} 匹配ab,abab,ababab
| 或者 root|bin

                                           匹配root|bin

\b 单词边界 \broot\b 匹配单词root,不匹配keroot,rooty等字符串
\< 单词的开头 \<th 匹配以th开头的单词
\> 单词的结束 \<root\> 作用与\broot\b相同
\w 字母数字下划线 \wa 匹配xa,不匹配#a
\s 匹配空白 \sa 匹配  a,不匹配xa
\d 匹配数字 -P \da 匹配n(数字)a,不匹配xa
[root@server0 ~]# grep "\(0:\)\{2\}" test  ##查找0:0:两次
root:x:0:0:root:/root:/bin/bash
[root@server0 ~]# grep "ro\{2\}t" test      ##查找前一个字符出现2次
root:x:0:0:root:/root:/bin/bash
[root@server0 ~]# grep -E "ro{2}t" test   ##效果同上
root:x:0:0:root:/root:/bin/bash
[root@server0 ~]# egrep  "ro{2}t" test    ##效果同上
root:x:0:0:root:/root:/bin/bash 
[root@server0 ~]# egrep  "ro{1,3}t" test   ##查找rot,其中o可以出现1次到3次
root:x:0:0:root:/root:/bin/bash
rot
rooot
[root@server0 ~]# grep  "ro\{1,\}t" test   ##查找rot,其中o可以出现1次及1次以上
root:x:0:0:root:/root:/bin/bash
rot
roooooooot
rooot
[root@server0 ~]# egrep  "ro{1,}t" test   ##效果同上
root:x:0:0:root:/root:/bin/bash
rot
roooooooot
rooot
[root@server0 ~]# egrep  "ro+t" test   ##查找rot其中o最少可以出现1次
root:x:0:0:root:/root:/bin/bash
rot
roooooooot
rooot
[root@server0 ~]# grep  "ro\{0,1\}t" test   ##查找rot,其中o可以出现0次到1次
rt
rot
[root@server0 ~# egrep  "ro{0,1}t" test   ##效果同上
rt
rot
[root@server0 ~# egrep  "ro?t" test   ##查找rot,其中o可以出现1次或0次
rt
rot
[root@server0 ~]# egrep "root|bin" test  ##查找有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
[root@server0 ~]# egrep "^root|^bin" test     ##查找以root开头或者以bin开头的行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@server0 ~]# egrep "^(root|bin)" test   ##效果同上
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@pserver0 ~]# vim abc   ##以ABC作为素材
the
1the
$the*
_thea
[root@server0 ~]# grep "the" abc   ##找有the的行
the
1the
$the*
_thea
[root@server0 ~]# grep "the\b" abc  ##找有the且右边不能是字母数字下划线
the
1the
$the*
[root@server0 ~]# grep "\bthe\b" abc  ##找有the且两边不能是字母数字下划线
the
$the*
[root@server0 ~]# grep "\bthe" abc  ##找有the且左边不能是字母数字下划线
the
$the*


sed基本用法

sed命令

sed,流式编辑器

  • 非交互,基于模式匹配过滤文件及修改文本
  • 逐行处理,并将结果输出到屏幕
  • 可实现对文本的输出,删除,替换,复制,剪切,导入,导出等各种操作

命令格式

  • 格式一:前置命令   |  sed  选项   (定址符)指令
  • 格式二: sed     选项    (定址符)指令    被处理的文件

常见的命令选项

-n 屏蔽默认输出(全部文本)
-i 直接修改文件内容,对文件进行实际操作
-r 启用扩展的正则表达式,若与其他选项一起使用,应作为首个选项
-e 指定需要执行的-e指令,支持使用多个-e参数
-f 指定需要执行的脚本文件,需要提前将sed指令写入文件中

条件,可以使行号或/正则/

行号可以使用单个数字表示单行

或者n,m表示连续的多行

省略条件,正则默认逐行处理全部文本

匹配正则时,则需要使用//

常用动作指令

替换操作的分隔"/"可改用其他字符,如#.&等,便于修改文件路径

操作符 用途 指令示例
p 打印行 2,4p    输出2 3 4 行
2p;4p   输出第2  4 行
d 删除行 2,4d     删除第2 3 4 行
s 字符串替换 s/old/new/   将每行的第一个old替换为new
s/old/new/3   将每行的第三个old替换为new
s/old/new/g    将所有的old都替换为new

 输出文本

[root@server0 ~]# cat test   ##以test文件作为素材
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@server0 ~]# sed 'p' test    ##输出+默认输出,所以是每行出现2次
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@server0 ~]# sed -n 'p' test   ## 输出全文
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@server0 ~]# sed -n '1p' test  ##输出第一行
root:x:0:0:root:/root:/bin/bash
[root@server0 ~]# sed -n '2p' test  ##输出第二行
bin:x:1:1:bin:/bin:/sbin/nologin
[root@server0 ~]# sed -n '3p' test   ##输出第三行
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@server0 ~]# sed -n '1,3p' test  ##输出1-3行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@server0 ~]# sed -n '1p;3p' test  ##输出第1行和第3行
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@server0 ~]# sed -n '1,+2p'  test  ##输出第1行以及后面2行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@server0 ~]# sed -n '3,+1p'  test   ##输出第3行以及后面1行
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@server0 ~]# sed -n '1~2p'  test   ##输出奇数行
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@server0 ~]# sed -n '2~2p'  test   ##输出偶数行
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@server0 ~]# sed -n '/root/p'  test  ##输出有root的行
root:x:0:0:root:/root:/bin/bash
[root@server0 ~]# sed -n '/^root/p'  test  ##输出以root开头的行
root:x:0:0:root:/root:/bin/bash
[root@server0 ~]# free | sed -n '2p'   ##输出free指令生成的文档的第2行
Mem:        1446924       70232     1108292        8608      268400     1211636
[root@server0 ~]# sed -rn '/root|bin/p'  test  ##输出有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
[root@server0 ~]# sed -n '$=' test   ##统计输出全文最后1行行号
5

删除文本

[root@server0 ~]# sed 'd' test   ##删除全文
[root@server0 ~]# sed '1d' test  ##删除第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@server0 ~]# sed '2d' test     ##删除第2行,
root:x:0:0:root:/root:/bin/bash
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@server0 ~]# sed '5d' test      ##删除第5行
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
[root@server0 ~]# sed '1,3d' test     ##删除1-3行
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@server0 ~]# sed '3,+2d' test     ##删除第3行以及后面2行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@server0 ~]# sed '/bash$/d' test   ##删除以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@server0 ~]# sed '1d;3d' test      ##删除第1行和第3行
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@server0 ~]# sed '1~2d' test      ##删除奇数行
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@server0 ~]# sed '2~2d' test      ##删除偶数行
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@server0 ~]# sed '$d' test    ##删除全文最后1行
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
[root@server0 ~]# sed '/var/!d' test    ##不删除有var的行
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

替换文本

[root@server0 ~]# vim hihi  ##以hihi作为素材
2017 2011 2018
2017 2017 2024
2017 2017 2017
[root@server0 ~]# sed 's/2017/xxxx/' hihi  ##将所有行的第1个2017替换成xxxx
xxxx 2011 2018
xxxx 2017 2024
xxxx 2017 2017
[root@server0 ~]# sed 's/2017/xxxx/2' hihi  ##将全文的第2列的2017替换成xxxx
2017 2011 2018
2017 xxxx 2024
2017 xxxx 2017
[root@server0 ~]# sed 's/2017/xxxx/g' hihi  ##将全文的2017替换成xxxx
xxxx 2011 2018
xxxx xxxx 2024
xxxx xxxx xxxx
[root@server0 ~]# sed '2s/2017/xxxx/' hihi  ##将第2行的第1个2017替换成xxxx
2017 2011 2018
xxxx 2017 2024
2017 2017 2017
[root@server0 ~]# sed '3s/2017/xxxx/2' hihi  ##将第3行的第2个2017替换成xxxx
2017 2011 2018
2017 2017 2024
2017 xxxx 2017
[root@server0 ~]# sed '3s/2017//2' hihi   ##潜在的删除功能,将第3行的第2个2017替换成空
2017 2011 2018
2017 2017 2024
2017 2017
[root@server0 ~]# sed 's/2024/xxxx/p' hihi  ##将所有行的2024替换成xxxx
2017 2011 2018
2017 2017 xxxx
2017 2017 xxxx
2017 2017 2017

如何把/bin/bash换成/sbin/sh?

[root@server0 ~]# cat test  ##以test作为素材
root:x:0:0:root:/root:/bin/bash
[root@server0 ~]# sed  's/\/bin\/bash/\/sbin\/sh/'   test  ##正常替换,繁琐
root:x:0:0:root:/root:/sbin/sh
[root@server0 ~]# sed   's#/bin/bash#/sbin/sh#'    test   ##修改替换符,简洁
root:x:0:0:root:/root:/sbin/sh 


sed替换应用

创建素材文件:nssw.txt

[root@server0 ~]# vim nssw.txt
Hello the world
ni ha4o ma beijing

删除文件中每行的第二个,最后一个字符

[root@server0 ~]# sed 's/.//2;s/.$//' nssw.txt 
hllo the world
n hao ma beijin

将文件中每行的第一个,倒数第一个字符互换

[root@server0 ~]# sed -r 's/^(.)(.*)(.)$/\3\2\1/'  nssw.txt 
dello the worlh
gi hao ma beijinn

删除文件中的数字

[root@server0 ~]# sed  -i 's/[0-9]//g'  nssw.txt 
hello the world
ni hao ma beijing

为文件中每个大写字母添加括号

[root@server0 ~]# sed -r  's/([A-Z])/{\1}/g' nssw.txt 
{H}ello t{H}e world
ni hao {M}a bei{J}ing
[root@server0 ~]# sed -r  's/([A-Z])/[\1]/g' nssw.txt 
[H]ello t[H]e world
ni hao [M]a bei[J]ing
[root@server0 ~]# sed -r  's/([A-Z])/(\1)/g' nssw.txt 
(H)ello t(H)e world
ni hao (M)a bei(J)ing

编写脚本,搭建ftp服务,并且实现匿名上传功能

测试:在真机上连接ftp://172.25.0.11进入pub目录,注意selinux和防火墙的影响!!!!!!!!!!!!!!!!!!!!!!!

[root@server0~]# vim test03.sh
#!/bin/bash
#这是一个简单的ftp服务
if [ "$USER" != "root" ];then
echo "你不是管理员,没有权限哦!"
exit 2
fi
rpm -q vsftpd
if [ $? -ne 0 ];then
yum -y install vsftpd  &> /dev/null 
sed -i '/^#anon_upl/s/#//'  /etc/vsftpd/vsftpd.conf
systemctl restart vsftpd
systemctl enable  vsftpd  &> /dev/null
chmod 777 /var/ftp/pub
#setenforce 0               ##安装有防火墙就需要这2行
#systemctl stop  firewalld   
else
echo "请稍等..."
sed -i '/^#anon_upl/s/#//'  /etc/vsftpd/vsftpd.conf
systemctl restart vsftpd
systemctl enable  vsftpd  &> /dev/null
chmod 777 /var/ftp/pub
#setenforce 0               ##安装有防火墙就需要这2行
#systemctl stop  firewalld   
fi

sed的文本块处理动作

操作符 用途 指令示例
i
 
行前插入文本 2iYY     在第二行之前添加文本行"YY"
4,7iYY   在第4-7行的每一行前添加文本行
a
 
行后插入文本 2aYY      在第二行之后添加文本
/^XX/aYY   在以XX开头的行之后添加文本
c 替换当前行 2cYY      将第二行的内容修改为"YY"

处理多行文本:修改后的文本有多行时

  • 以换行符 \n 分隔
  • 或者,使用 \ 强制换行 

a行后追加练习

[root@server0 ~]# cat 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@server0 ~]# sed '1a XXXX' user               #第一行下追加字母
root:x:0:0:root:/root:/bin/bash
XXXX
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@server0 ~]# sed '1,3a XXXX' user             #第1-3行下都追加字母
root:x:0:0:root:/root:/bin/bash
XXXX
bin:x:1:1:bin:/bin:/sbin/nologin
XXXX
daemon:x:2:2:daemon:/sbin:/sbin/nologin
XXXX
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

[root@server0 ~]# sed '1,+1a XXXX' user             #第一行以及后面的一行追加字母
root:x:0:0:root:/root:/bin/bash
XXXX
bin:x:1:1:bin:/bin:/sbin/nologin
XXXX
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@server0 ~]# sed '/root/a XXXX' user           #有root的行下追加
root:x:0:0:root:/root:/bin/bash
XXXX
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

i行前追加练习

[root@server0~]# sed 'i 666' test  ##所有行前添加一行666
666
root:x:0:0:root:/root:/bin/bash
666
bin:x:1:1:bin:/bin:/sbin/nologin
666
daemon:x:2:2:daemon:/sbin:/sbin/nologin
666
adm:x:3:4:adm:/var/adm:/sbin/nologin
666
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@server0~]# sed '2,+1i 666' test  ##第2~3行前添加一行666
root:x:0:0:root:/root:/bin/bash
666
bin:x:1:1:bin:/bin:/sbin/nologin
666
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@server0~]# sed '/root/i 666' test  ##有root的行前添加一行666
666
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@server0~]# sed '/^root/i 666' test  ##以root开头的行添加一行666
666
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@server0~]# sed '2i 666' test    ##第2行前添加一行666
root:x:0:0:root:/root:/bin/bash  
666
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

c替换练习

[root@server0 ~]# sed 'c XXXX' user                   #将所有行替换为XXXX
XXXX
XXXX
XXXX
XXXX
XXXX

[root@server0 ~]# sed '1c XXXX' user                 #将第一行替换成XXXX
XXXX
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@server0 ~]# sed '1,2c XXXX' user                #将第一二行替换成XXXX
XXXX
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@server0 ~]# sed '/root/c XXXX' user           #将以root开头的行替换成XXXX
XXXX
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高级应用

导入导出操作

  • r 动作应结合 -i 选项才会存入,否则只输出
  • w 动作以覆盖的方式另存为新文件
操作符   用途 指令示例
r 读取文件 3r b.txt 在第3行下方添加文件b.txt
4,7r b.txt 在第4-7行后添加文件b.txt
w 保存到文件 3w c.txt 将第3行另存为文件c.txt
4,7w c.txt 将第4-7行另存为文件c.txt

!取反操作

用途:

  • 根据定址条件取反

示例

  • 列出不使用bash的用户账号记录
[root@server0]# sed -n '/bash$/!p' /etc/passwd  ##输出不是以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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
......

sed综合脚本应用

编写一个脚本

要求编写脚本getupwd.sh,实现以下需求:

  • 找到使用bash作登录Shell的本地用户
  • 列出这些用户的shadow密码记录
  • 按每行“用户名 --> 密码记录”保存到getupwd.log,如图-1所示

方案:

  1. 先用sed工具取出登录Shell为/bin/bash的用户记录,保存为临时文件/tmp/urec.tmp,并计算记录数量
  2. 再结合while循环遍历取得的账号记录,逐行进行处理
  3. 针对每一行用户记录,采用掐头去尾的方式获得用户名、密码字串
  4. 按照指定格式追加到/tmp/getuupwd.log文件
  5. 结束循环后删除临时文件,报告分析结果
[root@server0 ~]# vim  1.sh
#!/bin/bash
#这是一个存放可登陆shell用户的脚本
u=`sed  -n  '/bash$/s/:.*//p'   /etc/passwd`            #先找到以bash结尾的登录用户
for i in  $u                                            #交给for循环处理
do
        w=`grep  "$i:"  /etc/shadow`                    #找到每个用户对应的shadow记录
        w1=${w#*:}                                      #掐头
        w2=${w1%%:*}                                    #去尾,得到纯粹的密码信息
        echo  "$i -->  $w2"
done
[root@server0 ~]# bash 1.sh
root -->  $6$UiGI4Tc2$htsXYn5cJnOqv3P1VLcUSgfjDu2pL5yiJBuua6foZAHdwqeuLHfYUfS/vBn27Wjvoel8EJgtdsMjyquqvKAmf1
student -->  $6$8oIjLCsc$/n1iQXYh1E6.uOEuJKgioqAtmqm2TQmkJGF2RwyteIr1tIfrPdiRYgWe6Sjen5/eMij2uHM/a1tue/QRlo3X80
hsjdh -->  $6$98VeecB8$Egm5RIgr4atgvvJVIYQyXf5BIMfJLKt8txHkWU/aTxJIZTqZWLOwxtHdS7mbgnUlGFi7sqvrB6npWosidKzQ41
发布了37 篇原创文章 · 获赞 48 · 访问量 1673

猜你喜欢

转载自blog.csdn.net/tian1345/article/details/103868361
今日推荐