栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

云计算——shell的运用

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

云计算——shell的运用

   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

一、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正则表达式

正则表达式三剑客:grep、sed、awk

正则表达式:可以帮助运维,从过多的文件内容当中,获取你想要的任何数据

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
...
.....

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/395938.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号