shell 的参数链接
介绍
shell:是一个用C语言编写的程序,它是用户使用linux的桥梁 ;shell是系统的用户界面提供了用户与内核进行交互操作的一种接口
Shell:是一个命令行解释器,它为用户提供了一个面向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
Shell:还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令
在公司中应用的环境:
shell 脚本 :70%以上是和任务计划结合完成任务( 分 时 日 月 周 命令或者是脚本进行查看或者执行) ;或者做一些复杂的、重复性任务,可以帮助管理员实现批量化完成任务,实现自动化运维。
命令的分类
内部命令: 集成于shell 解释器内部的一些特殊指令,不对应单独的系统文件,自动载入内存,用户可直接使用的命令
外部命令:在Linux 系统中能够完成特定功能的脚本文件或二进制程序,每个外部命令会对应一个系统文件 (要想使用必须知道外部命令对应文件的位置)
注意: Linux系统会将外部命令所在的位置添加到默认的“搜索路径”中;所以用户在执行命令时不需要知道完整路径,直接执行该命令即可
任何一门语言都有解释器: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 |
定义:是用来存放系统和用户需要使用的特定参数,这些特定参数会根据用户的设定或环境的变化而变化(可以变化的物理量)
变量的组成: 变量名 + 变量值; 定义变量的基本格式 “变量名=变量值”
变量名的命名规则:不能以数字和特殊符号开头
--------------系统变量 [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 $? 0if 条件语句
在七章——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循环 for循环shell脚本或代码的编写方式基本上都是围绕的需求来编写的
案例
[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 |
| ||||||||||||||||||||||
显示基数
[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正则表达式
正则表达式三剑客:grep、sed、awk
正则表达式:可以帮助运维,从过多的文件内容当中,获取你想要的任何数据
| 1 | ^ | 输入字符串的开始位置;如果在"[]" 括号内使用,表示不包含该字符;如果要匹配^使用“^” | ||||||||||
| 2 | $ | 输入字符串的结尾位置 ,要匹配$号需要“$” | ||||||||||
| 3 | . | 任意一个字符 | ||||||||||
| 4 |
| |||||||||||
| 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 #查找“组”字符串 cqqpsed工具
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 ... .....



