IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 云计算——shell的运用 -> 正文阅读

[系统运维]云计算——shell的运用

???shell 的参数链接

? 介绍

?在公司中应用的环境:

?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主机的名称
SHELLshell的全路径名
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次
11a\{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
...
.....
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-10-28 12:41:54  更:2021-10-28 12:41:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 22:55:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码