? 介绍
?在公司中应用的环境:
?shell 脚本 :70%以上是和任务计划结合完成任务( 分 时 日 月 周? ?命令或者是脚本进行查看或者执行)?;或者做一些复杂的、重复性任务,可以帮助管理员实现批量化完成任务,实现自动化运维。
任何一门语言都有解释器:python、php、java、c、c++ 等等,在所有语言运行的时候,都会先转换成机器码,然后在去运行
[root@C7--01 ~]# cat /etc/shells #linux有6种解释器
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
shell解释器以:
#!/bin/bash 或者 #!/bin/sh 为开头
python解释器以:
#!/usr/bin/env python 为开头
shell脚本在执行命令的时候是从上往下依次执行,在运行期间如有其中一行执行错误,程序仍然会继续执行命令直到结束
测试
vim cs.sh #后缀.sh可加可不加,但是习惯性需要加上
#!/bin/bash
ls /root
echo "你好,世界"
zzzzzzz
sleep 3
echo "彩虹"
保存退出
[root@C7--01 ~]# bash cs.sh #测试结果相同
anaconda-ks.cfg cs.sh yum.sh
你好,世界
cs.sh:行6: zzzzzzz: 未找到命令
彩虹
执行脚本操作 | 方法一 | bash? 脚本名称 | 不需要写解析器,并且不需要给脚本设置执行权限 | bash? -n? ?脚本名称 | ?-n??选项只做语法检查,而不执行脚本 | bash? -vx? 脚本名称 | 调试脚本,脚本输出 | 方法二 | sh? ? ? 脚本名称 | 不需要写解析器,并且不需要给脚本设置执行权限 | 方法三 | source? 脚本名称 | 不需要写解析器,并且不需要给脚本设置执行权限 | 方法四 | ./? ?脚本名称? ?(在当前工作目录下执行脚本) | 需要写解析器,需要给脚本设置执行权限 |
系统变量 | $$ | 返回当前shell本身进程号的PID | $! | shell最后运行的后台procwss的PID(在shell里面嵌套shell所返回的PID) | $@ | 所有参数列表,用? ""? ?括起来是以单体输出 | $* | 所有参数列表,用? ""? ?括起来是以整体输出 | $- | 使用set命令设定的Flag一览 | $# | 表示统计命令行中位置参数的个数 | $0 | 表示当前执行的命令或脚本程序的名称 | $? | 用于查看前一条命令执行后的返回状态?(返回0 说明前一条命令正确;返回非0 值,说明前一条出现异常) |
逻辑测试 | && | 逻辑与,且的意思;要求所有的条件都得满足 (如果使用test 进行测试时,可以用 -a 代替)(前面的命令执行成功,才会执行后面的命令) | || | 逻辑或的意思;多个条件只要满足一个即可 (如果使用test 进行测试时,可以使用 -o 代替) | ! | 逻辑否的意思;表示“不”;当指定条件不成立时,测试命令返回值为 0 |
一、shell脚本变量
定义:是用来存放系统和用户需要使用的特定参数,这些特定参数会根据用户的设定或环境的变化而变化(可以变化的物理量)
变量的组成: 变量名 + 变量值; 定义变量的基本格式 “变量名=变量值” 变量名的命名规则:不能以数字和特殊符号开头
--------------系统变量
[root@C7--01 ~]# env #输入env会输出系统本地原有的变量
XDG_SESSION_ID=25
HOSTNAME=C7--01
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=192.168.1.254 52271 22
SSH_TTY=/dev/pts/1
USER=root
.........
............
环境变量
定义:是出于运行需要,由Linux系统提前创建的一类变量,主要用于设置用户的工作环境;包括用户的宿主目录、命令查找路径、用户当前目录,登录终端等
注意:环境变量的值是随着Linux系统自动维护,会随着用户状态改变而自动改变
环境变量 | 说明 |
---|
PATH | 指定命令的搜索路径,以冒号为分隔符 | HOME | 指定用户的主工作目录 | HISTSIZE | 命令历史文件 | LOGNAME | 当前的登录名 | HOSTNAME | 主机的名称 | SHELL | shell的全路径名 | TERM | 用户控制终端的类型 | PWD | 当前工作目录的全称 | PS1 | 命令基本提示符,root用户是“#”,对于普通用户是“"$" |
案例
[root@C7--01 ~]# pwd
/root
[root@C7--01 ~]# echo $PWD
/root
自定义变量
定义:由系统用户自己去定义,只在用户的自己shell 环境中有效,又称为本地变量
定义自定义变量的基本格式 "变量名=变量值” (注意:变量名以字母或下划线开头,不能包含特殊字符(+,-,/,%,#等);等于号两侧没有空格)
注意:默认情况下,用户所定义的变量只在当前登录shell 中生效,在其他的子shell或其他终端,新shell环境中不生效,这种称为局部变量 全局变量:让用户所定义的变量能够在所有的子shell 环境中使用,减少重复设置工作?
?案例
[root@C7--01 ~]# bj=hd
[root@C7--01 ~]# echo $bj
hd
位置变量
在位置变量中空格输入在多其位置还是第一位,位置变量最多为9,但是超过9就是10两位,就需要? 花括号? {}
[root@C7--01 ~]# vim wzbl.sh
#!/bin/bash
echo '$1'的值是"$1"
echo '$2'的值是"$2"
echo '$3'的值是"$3"
echo '$4'的值是"$4"
echo '$5'的值是"$5"
echo '$6'的值是"$6"
echo '$7'的值是"$7"
echo '$8'的值是"$8"
echo '$9'的值是"$9"
echo '$10'的值是"$10"
[root@C7--01 ~]# bash wzbl.sh 执行脚本
$1的值是
$2的值是
$3的值是
$4的值是
$5的值是
$6的值是
$7的值是
$8的值是
$9的值是
$10的值是0
案例 1
[root@C7--01 ~]# bash wzbl.sh A #不管空格输入了多少始终是第一位
$1的值是A
$2的值是
$3的值是
$4的值是
$5的值是
$6的值是
$7的值是
$8的值是
$9的值是
$10的值是A0 # 在系统环境中在识别时会认为是$1,我们的认为是$10
[root@C7--01 ~]# vim wzbl.sh
#!/bin/bash
echo '$1'的值是"$1"
echo '$2'的值是"$2"
echo '$3'的值是"$3"
echo '$4'的值是"$4"
echo '$5'的值是"$5"
echo '$6'的值是"$6"
echo '$7'的值是"$7"
echo '$8'的值是"$8"
echo '$9'的值是"$9"
echo '$10'的值是"${10}" #修改
[root@C7--01 ~]# bash wzbl.sh A
$1的值是A
$2的值是
$3的值是
$4的值是
$5的值是
$6的值是
$7的值是
$8的值是
$9的值是
$10的值是 #无变量值
$@和$*的区别(注意是在for循环中,如有不同方法实现可留言) | $@ | 所有参数列表,用? ""? ?括起来是以单体输出 | $* | 所有参数列表,用? ""? ?括起来是以整体输出 |
案例
[root@C7--01 ~]# vim wzbl.sh
#!/bin/bash
echo '$1'的值是"$1"
echo '$2'的值是"$2"
echo '$3'的值是"$3"
for i in "$*"
do
echo $i
done
for i in "$@"
do
echo $i
done
保存退出
验证位置变量:
[root@C7--01 ~]# bash wzbl.sh A B C
$1的值是A
$2的值是B
$3的值是C
A B C #$*是整体输出
A #$@是单体输出
B
C
$# | 表示统计命令行中位置参数的个数 | $0 | 表示当前执行的命令或脚本程序的名称 | $? | 用于查看前一条命令执行后的返回状态?(返回0 说明前一条命令正确;返回非0 值,说明前一条出现异常) | $$ | 返回当前shell本身的PID |
[root@C7--01 ~]# vim wzbl.sh
#!/bin/bash
echo '$1'的值是"$1"
echo '$2'的值是"$2"
echo '$3'的值是"$3"
echo $#
echo $0
echo $?
echo $$
sleep 30 #进程保留30s
保存退出
验证:
[root@C7--01 ~]# bash wzbl.sh A B C
$1的值是A
$2的值是B
$3的值是C
3 # $# 统计命令行中位置参数的个数
wzbl.sh # $0 当前执行的命令或脚本程序的名称
0 # $? 查看返回状态(返回0上一条命令执行成功,返回非0说明异常)
14947 # $$ 当前shell本身的PID
重新打开一个端口查询
[root@C7--01 ~]# ps aux | grep 14947
root 14947 0.0 0.1 113132 1392 pts/1 S+ 09:42 0:00 bash wzbl.sh A B C
root 14996 0.0 0.0 112676 980 pts/2 R+ 09:42 0:00 grep --color=auto 14993
二、shell条件判断
基本相同: 七章——Shell脚本应用(二)(应用——linux高级管理)
目的:shell 环境会根据执行命令返回后状态值($?)来判断条件是否执行成功(返回值为0 表示成功;返回值为非0 值表示失败或异常) 进行条件判断的基本语法: 第一种: ? test ? 条件表达式 第二种: ? [? 操作符? ?对象? ] ?("[" 和条件表达式之间最少要有一个空格)
?判断文件和目录的操作符
判断选项 | -d | 测试目录存在 | -e | 测试文件或目录是否存在 | -f | 测试文件存在 | -r | 测试当前用户是否拥有读取权限 | -w | 测试当前用户是否拥有写入权限 | -x | 测试当前用户是否拥有执行权限 |
[root@C7--01 ~]# [ -d /mnt ] && echo "存在"
存在
[root@C7--01 ~]# [ -f /etc/passwd ]
[root@C7--01 ~]# echo #?
[root@C7--01 ~]# [ -e /mnt ]
[root@C7--01 ~]# [ -e /etc/psswd ]
整数值比较
整数值操作符? | -eq | 第1个数等于第2个数? ? ? ? ? 1 = 1? | -ne | 第1个数不等于第2个数? ? ? 1 ≠ 2 | -gt | 第1个数大于第2个数? ? ? ? ? 10 > 5 | -lt | 第1个数小于第2个数? ? ? ? ?5 < 10? | -ge | 第1个数大于等于第2个数? ? 5或者10 ≥ 5 | -le | 第1个数小于等于第2个数? ? 1≤1 或者 10 |
输入格式:? [? ?整数值? ?操作符? ?整数值? ? ]?
计算运算
运算符 | 加法运算 | + | 减法运算 | - | 乘法运算 | \* | 除法运算 | /? | 求模运算 | % |
[root@C7--01 ~]# expr 1 + 1
2
[root@C7--01 ~]# expr 2 - 2
0
[root@C7--01 ~]# expr 2 \* 2
4
[root@C7--01 ~]# expr 2 % 2
0
[root@C7--01 ~]# expr 2 / 2
1
?案例
在100已内取随机数字
[root@C7--01 ~]# echo $(expr $RANDOM % 101)
58
[root@C7--01 ~]# echo $(expr $RANDOM % 101)
27
[root@C7--01 ~]# echo $(expr $RANDOM % 101)
26
字符串比较
字符串符号 | = | 第一个字符串和第二个字符串相同 | != | 第一个字符串和第二个字符串不相同(! 就是取反) | -z | 用来检查字符串是否为空 |
[root@C7--01 ~]# [ a = a ]
[root@C7--01 ~]# echo $?
0
[root@C7--01 ~]# [ a != a ]
[root@C7--01 ~]# echo $?
1
[root@C7--01 ~]# [ a != c ]
[root@C7--01 ~]# echo $?
0
if 条件语句
在七章——Shell脚本应用(二)(应用——linux高级管理)课程中有详细的案例
单分支if 语句
if ? [ 条件表达式 ]? ? ? ? ? ? ? (判断,如果条件成立)
then ?
? ? ? ? ? 命令序列 ? ? ? ? ? ? ? (执行命令序列)
fi? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (结束判断:条件不成立,不做任何操作)
双分支语句
if [ 条件表达式 ]
then
命令序列1
else ? (除以上条件外的)
命令序列2
fi
多分支语句
if ? [ 条件测试1 ]
then
命令序列1
elif [ 条件测试2 ]
then ?
命令序列2
elif ?[ 条件测试3 ]
then
命令序列3
elif ?[ 条件测试n ]
then ?
命令序列n
else
命令序列(n+1)
fi
案例:随机点名册
[root@C7--01 ~]# vim yyds.sh
#!/din/bash
DMC=( 小米 坤坤 政治 z A B C 网红 小车 运行 红蜘蛛 碰碰车 清除 小白 小红 AAA bbb ccc 没头脑 )
num=$(expr $RANDOM % 19) #取值范围是0-18,具体多少看num
echo "${DMC[$num]}" #所以num为随机的
保存
[root@C7--01 ~]# bash yyds.sh
红蜘蛛
[root@C7--01 ~]# bash yyds.sh
小米
[root@C7--01 ~]# bash yyds.sh
bbb
[root@C7--01 ~]# bash yyds.sh
运行
[root@C7--01 ~]# bash yyds.sh
政治
[root@C7--01 ~]# bash yyds.sh
z
[root@C7--01 ~]# bash yyds.sh
清除
[root@C7--01 ~]# bash yyds.sh
bbb
[root@C7--01 ~]# bash yyds.sh
小车
[root@C7--01 ~]# bash yyds.sh
小白
[root@C7--01 ~]# bash yyds.sh
B
[root@C7--01 ~]# bash yyds.sh
小米
案例
[root@C7--01 ~]# vim yyds.sh
#!/din/bash
echo "
欢迎登录BDQN root管理员
一期: 12000
二期: 14000
三期: 18000
云计算: 22000
运维开发: 25100
启蒙星: 10000
"
yu=12000
su=25100
read -p "请输入您的经费有多少:" money
if [ $money -lt $yu ];then echo "钱不够继续打工吧";exit;fi
read -p "你想咨询什么课程(一期|运维开发):" course
if [[ $money -ge $yu && $money -lt $su && $course = 运维开发 ]];then
echo "你的钱只能选择一期"
elif [ $money -ge $su ];then
if [ $course = 一期 ];then
bslance=`expr $money - $yu`
echo "恭喜你报名成功,还剩$bslance"
elif [ $course = 运维开发 ];then
bslance=`expr $money - $su`
echo "恭喜你报名成功,还剩$bslance"
fi
elif [[ $money -lt $su && $money -ge $yu ]];then
bslance=`expr $money - $yu`
echo "恭喜你报名成功,还剩$bslance"
else
echo "再见"
fi
验证:
[root@C7--01 ~]# bash yyds.sh
欢迎登录BDQN root管理员
一期: 12000
二期: 14000
三期: 18000
云计算: 22000
运维开发: 25100
启蒙星: 10000
请输入您的经费有多少:100
钱不够继续打工吧
[root@C7--01 ~]# bash yyds.sh
欢迎登录BDQN root管理员
一期: 12000
二期: 14000
三期: 18000
云计算: 22000
运维开发: 25100
启蒙星: 10000
请输入您的经费有多少:13000
你想咨询什么课程(一期|运维开发):运维开发
你的钱只能选择一期
[root@C7--01 ~]# bash yyds.sh
欢迎登录BDQN root管理员
一期: 12000
二期: 14000
三期: 18000
云计算: 22000
运维开发: 25100
启蒙星: 10000
请输入您的经费有多少:50000
你想咨询什么课程(一期|运维开发):一期
恭喜你报名成功,还剩38000
[root@C7--01 ~]# bash yyds.sh
欢迎登录BDQN root管理员
一期: 12000
二期: 14000
三期: 18000
云计算: 22000
运维开发: 25100
启蒙星: 10000
请输入您的经费有多少:50000
你想咨询什么课程(一期|运维开发):运维开发
恭喜你报名成功,还剩24900
shell脚本或代码的编写方式基本上都是围绕的需求来编写的
三、shell循环
?for循环
?案例
[root@C7--01 ~]# vim xh.sh
#!/bin/bash
name=( aaa bbb ccc 迪迪热吧 古力娜扎 萨拉哈哈 噗噗嘎嘎 亘古未闻 )
for abc in ${name[*]}
do
echo "systemctl$abc"
done
保存
[root@C7--01 ~]# bash xh.sh
systemctlaaa
systemctlbbb
systemctlccc
systemctl迪迪热吧
systemctl古力娜扎
systemctl萨拉哈哈
systemctl噗噗嘎嘎
systemctl亘古未闻
continue | 跳过当前循环 | break | 结束当前循环 | exit | 结束脚本 |
案例? 2
[root@C7--01 ~]# vim xh.sh
#!/bin/bash
name=( aaa bbb ccc 迪迪热吧 古力娜扎 萨拉哈哈 噗噗嘎嘎 亘古未闻 )
for abc in ${name[*]}
do
if [[ $abc = bbb || $abc = 古力娜扎 || $abc = 亘古未闻 ]]
then
echo "systemctl$abc"
fi
continue
done
[root@C7--01 ~]# bash xh.sh
systemctlbbb
systemctl古力娜扎
systemctl亘古未闻
?案例:用户循环
[root@C7--01 ~]# vim dl.sh
#!/bin/bash
user=root
pass=123
n=3
for i in {1..3}
do read -p "输入用户名:" name
let n--
if [ $name != $user ]
then
echo "用户名错误,还有${n}次机会"
elif [ $name = $user ]
then
for i in {1..3}
do
read -p "输入密码:" mima
if [ $mima != $pass ]
then
echo "密码错误,重新输入"
else
echo "登录成功"
exit
fi
done
if [ $n = 0 ];then break;fi
fi
done
?验证
[root@C7--01 ~]# bash dl.sh
输入用户名:r
用户名错误,还有2次机会
输入用户名:r
用户名错误,还有1次机会
输入用户名:root
输入密码:15
密码错误,重新输入
输入密码:15
密码错误,重新输入
输入密码:123
登录成功
[root@C7--01 ~]# bash dl.sh
输入用户名:rot^H^H^H
用户名错误,还有2次机会
输入用户名:root
输入密码:123
登录成功
wile循环
案例?
[root@C7--01 ~]# vim while.sh
#!/bin/bash
u=1
while [ $u -le 5 ]
do
echo $u
let u++
done
保存
[root@C7--01 ~]# bash while.sh
1
2
3
4
5
?案例? ?2
[root@C7--01 ~]# vim while.sh
#!/bin/bash
u=1
while [ $u -le 5 ]
do
if [ $u -eq 1 ] || [ $u -eq 2 ]
then
let u++
continue
fi
echo $u
let u++
done
[root@C7--01 ~]# bash while.sh
3
4
5
四、shell脚本练习
猜数字游戏,随机生成(1-100),有三次机会
[root@C7--01 ~]# vim sjb.sh
#!/bin/bash
num=$(expr $RANDOM % 101 )
echo $num
n=1
while [ $n -le 3 ]
do
read -p "输入数字:" qu
let n++
if [ $qu -ne $num ]
then
continue
else
echo "恭喜你猜对了"
exit
fi
done
[root@C7--01 ~]# bash sjb.sh
76
输入数字:77
输入数字:56
输入数字:76
恭喜你猜对了
99乘法表
[root@C7--01 ~]# vim 99.sh
#!/bin/bash
for x in {1..9}
do
for y in {1..9}
do
if [ $y -le $x ]
then
echo -e -n "$y * $x = $(expr $x \* $y ) "
fi
done
echo " "
done
[root@C7--01 ~]# bash 99.sh
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
echo选项 | -n | 不自动换行 | -e |
若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出: | \a | 发出警告声 | \b | 删除前一个字符 | \c | 最后不加上换行符号 | \f | 换行但光标仍旧停留在原来的位置 | \n | 换行且光标移至行首 | \r | 光标移至行首,但不换行 | \t | 插入tab | \v | 与\f相同 | \\ | 插入\字符 | \nnn | 插入nnn(八进制)所代表的ASCII字符 |
|
显示基数
[root@C7--01 ~]# seq 1 2 100
1
3
5
7
9
11
13
15
17
19
21
..
..
...
...
....
[root@C7--01 ~]# vim js.sh
#!/bin/bash
for i in {1..100}
do
if [ $(expr $i % 2) -ne 0 ]
then
echo $i
fi
done
保存
[root@C7--01 ~]# bash js.sh
1
3
5
7
9
11
13
15
17
19
21
23
25
27
...
...
....
?计算1到100的和
[root@C7--01 ~]# vim sum.sh
#!/bin/bash
sum=0
for i in {1..100}
do
sum=$(expr $sum + $i )
done
echo $sum
保存
[root@C7--01 ~]# bash sum.sh
5050
五、shell正则表达式
正则表达式:可以帮助运维,从过多的文件内容当中,获取你想要的任何数据
1 | ^ | 输入字符串的开始位置;如果在"[]" 括号内使用,表示不包含该字符;如果要匹配^使用“\^” | 2 | $ | 输入字符串的结尾位置 ,要匹配$号需要“\$” | 3 | . | 任意一个字符 | 4 | \ |
转义符,将下一字符标记为特殊字符,原义字符 | \n | 匹配换行符 | \r | 匹配回车 | \w | 匹配单个单词字符(字母、数字与_) | \W | 匹配特殊符号 |
| 5 | * | 代表的是重复零个或多个前面的单字符,要匹配*号可以使用 “\*” | 6 | [] | 字符集合,匹配所包含的任意一个字符 | 7 | [^] | 匹配未包含的任意一个字符 | 8 | {n1-n2} | 匹配字符范围 | 9 | {n} | n 是一个非负整数,匹配确定的n次 | 10 | \{n,\} | 至少匹配n次 | 11 | a\{n,m\} | n 和 m 均是非负整数,n≤m;至少匹配n次,最多匹配m次 | 12 | "." 和"*" | 用来设定零个到无限多个重复的字符 | 13 | .* | 匹配所有字符。例: ^.*以任意多个字符开头, .*$以任意多个字符 |
?案例
[root@C7--01 ~]# vim aaa.txt
booc
boooooc
boooc
bc
boc
4563d
cccood
boooooooc
[root@C7--01 ~]# grep "bo\{1,4\}c" aaa.txt #以bo开头以c结尾,最少匹配1次最多匹配4次前面的一个字符o
booc
boooc
boc
[root@C7--01 ~]# grep "bo\{1,\}c" aaa.txt #最少1次最多没有上限
booc
boooooc
boooc
boc
boooooooc
[root@C7--01 ~]# grep "bo\{,4\}c" aaa.txt #最少没有为0,最多为4次
booc
boooc
bc
boc
?扩展的正则表达式
元字符 | 作用 | + | 重复一个或者一个以上的前一个字符 | ? | 零个或者一个的前一个字符 | | | 使用或者(or)的方式找出多个字符 | () | 查找“组”字符串 | ()+ | 辨别多个重复的组 |
注意:egrep? ,?grep? -E? ?或? ?sed? -r? 过滤一般特殊字符可以不转义
?案例
[root@C7--01 ~]# grep -E "bo+c" aaa.txt #重复一个或者一个以上的前一个字符
booc
boooooc
boooc
boc
boooooooc
[root@C7--01 ~]# grep -E "bo?c" aaa.txt #零个或者一个的前一个字符
bc
boc
案例? 1
[root@C7--01 ~]# vim aaa.txt
cabdp
cp
cap
cdp
cqqp
c123p
验证:
[root@C7--01 ~]# egrep "a|b|c" aaa.txt #使用或者(or)的方式找出多个字符
cabdp
cp
cap
cdp
cqqp
c123p
[root@C7--01 ~]# egrep "(qq)" aaa.txt #查找“组”字符串
cqqp
sed工具
vi 和 vim 不能在shell脚本中使用,因为这两个命令是交互式的?
sed:能够通过非交互式来完成对文件的增删改查操作
语法:sed 选项 '操作符'? 文件名
常见选项 | -n | 输出处理后的结果(sed默认输出全部内容) | -h | 显示帮助 | -e | 指定的脚本来处理输入文本(匹配多个command) | -f | 指定脚本处理输入的文本数据 | -i | 直接编辑文本文件 | -r | 支持扩展正则表达式 |
常见操作符 | a | 添加内容,当前行下面增加内容 | d | 删除,选定内容行 | p | 打印内容 | s | 替换指定字符 | y | 字符转换 | c | 将选定行替换成指定内容 | i | 插入,选定行上面插入一行内容 | H | 复制内容到剪贴板 | g、G | 将剪贴板中的数据覆盖/追加到指定行 | w | 保存文件 | r | 读取指定文件 | n | 读入下一输入行,并从下一条命令而不是第一条命令开始处理 |
?案例
[root@C7--01 ~]# sed -n '1,$'p aaa.txt #从第1行开始,到最后一行,打印出内容
cabdp
cp
cap
cdp
cqqp
c123p
[root@C7--01 ~]# sed -n 3,6p aaa.txt #打印3行到6行
cap
cdp
cqqp
c123p
[root@C7--01 ~]# sed -n '1p;3p' aaa.txt #只打印第1行和第3行
cabdp
cap
[root@C7--01 ~]# sed -n '/c.p/p' aaa.txt #匹配任意一个字符
cap
cdp
案例:删除文本内容
[root@C7--01 ~]# cat aaa.txt
cabdp
cp
cap
cdp
cqqp
c123p
[root@C7--01 ~]# sed -i '1d;5d' aaa.txt #删除1行和5行
[root@C7--01 ~]# cat aaa.txt
cp
cap
cdp
c123p
案例:修改内容
[root@C7--01 ~]# cat aaa.txt
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
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
[root@C7--01 ~]# sed -i 's/nologin/sss/g' aaa.txt #修改文件中所有nologin为sss
[root@C7--01 ~]# cat aaa.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/sss
daemon:x:2:2:daemon:/sbin:/sbin/sss
adm:x:3:4:adm:/var/adm:/sbin/sss
lp:x:4:7:lp:/var/spool/lpd:/sbin/sss
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/sss
operator:x:11:0:operator:/root:/sbin/sss
[root@C7--01 ~]# sed -i '5s/sss/nologin/g' aaa.txt #修改第5行sss为nologin
[root@C7--01 ~]# cat aaa.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/sss
daemon:x:2:2:daemon:/sbin:/sbin/sss
adm:x:3:4:adm:/var/adm:/sbin/sss
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/sss
operator:x:11:0:operator:/root:/sbin/sss
[root@C7--01 ~]# sed -i '/^mail/s/sss/nologin/g' aaa.txt #指定某一行的开头,替换指定的sss为nologin
[root@C7--01 ~]# cat aaa.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/sss
daemon:x:2:2:daemon:/sbin:/sbin/sss
adm:x:3:4:adm:/var/adm:/sbin/sss
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/sss
案例:添加注释
[root@C7--01 ~]# sed -i '3s/^/#/g' aaa.txt #给第3行添加#号
[root@C7--01 ~]# cat aaa.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/sss
#daemon:x:2:2:daemon:/sbin:/sbin/sss
adm:x:3:4:adm:/var/adm:/sbin/sss
[root@C7--01 ~]# sed -i '5,7s/^/#/g' aaa.txt #给5到7行添加#号
[root@C7--01 ~]# cat aaa.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/sss
#daemon:x:2:2:daemon:/sbin:/sbin/sss
adm:x:3:4:adm:/var/adm:/sbin/sss
#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/sss
[root@C7--01 ~]# sed -i '5,7s/#//g' aaa.txt #去除5到7行的#号
[root@C7--01 ~]# cat aaa.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/sss
#daemon:x:2:2:daemon:/sbin:/sbin/sss
adm:x:3:4:adm:/var/adm:/sbin/sss
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/sss
案例:插入内容
[root@C7--01 ~]# sed -i '2i方便面' aaa.txt #插入到第2行
[root@C7--01 ~]# cat aaa.txt
root:x:0:0:root:/root:/bin/bash
方便面
bin:x:1:1:bin:/bin:/sbin/sss
[root@C7--01 ~]# sed -i '6anologin' aaa.txt #插入到第6行的下一行
[root@C7--01 ~]# cat aaa.txt
root:x:0:0:root:/root:/bin/bash
方便面
bin:x:1:1:bin:/bin:/sbin/sss
#daemon:x:2:2:daemon:/sbin:/sbin/sss
adm:x:3:4:adm:/var/adm:/sbin/sss
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
nologin
...
.....
|