本文主要是介绍字符串的初值 正则表达式 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:
- 文本处理顺序:
- 以行为单位,逐行进行处理
- 默认只输出与表达式相匹配的文本行
- 基本用法: 等同于grep -E ,表示允许使用扩展的正则表达式
- 格式1:egrep [选项] "正则表达式" 文件...
- 格式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所示
方案:
- 先用sed工具取出登录Shell为/bin/bash的用户记录,保存为临时文件/tmp/urec.tmp,并计算记录数量
- 再结合while循环遍历取得的账号记录,逐行进行处理
- 针对每一行用户记录,采用掐头去尾的方式获得用户名、密码字串
- 按照指定格式追加到/tmp/getuupwd.log文件
- 结束循环后删除临时文件,报告分析结果
[root@server0 ~]# vim 1.sh
#!/bin/bash
#这是一个存放可登陆shell用户的脚本
u=`sed -n '/bash$/s/:.*//p' /etc/passwd` #先找到以bash结尾的登录用户
for i in $u #交给for循环处理
dow=`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
这篇关于字符串的初值 正则表达式 sed应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!