zoukankan      html  css  js  c++  java
  • sed命令详解

    阅读目录

    • 1.1 查找固定的某一行
    • 1.2 sed的替换
    • 1.3 单引号 双引号 不加引号的区别
    • 1.4 sed与变量
    • 1.5 【企业案例】系统开机启动项优化
    • 1.6 &符号的使用
    • 1.7 【练习题】把person.txt 中包含yy的行 这一行里面的数字替换为空
    • 1.8 查看sed更多的帮助信息【info】
    • 1.9 sed基本用法
    • 1.10 sed追加内容
    • 2.1 什么是shell
    • 2.2 如何查看当前用户的命令解释器
    • 2.3 书写shell脚本的要求
    • 2.4 shell脚本之变量
    • 2.5 手动创建一个环境变量
    • 2.6 shell脚本与变量
    • 2.7 与用户有关的环境变量配置文件/目录
    • 2.8 变量命名规则
    • 2.9 shell中的特殊变量
    • 3.1 vim中进行查找替换
    • vim命令粘贴带#号或注释信息格式会出现混乱情况解决?
    •  用sed和awk实现将文本中的上下两行合并为一行
    • 第1章 sed命令详解

    • 1.1 查找固定的某一行

    • 1.1.1 awk命令方法

      [root@znix ~]# awk '!/oldboy/' person.txt
      102,zhangyao,CTO
      103,Alex,COO
      104,yy,CFO
      105,feixue,CIO

      1.1.2 grep方法

      [root@znix ~]# grep -v "oldboy" person.txt
      102,zhangyao,CTO
      103,Alex,COO
      104,yy,CFO
      105,feixue,CIO

      1.1.3 sed方法

      复制代码
      [root@znix ~]# sed -n '/oldboy/!p' person.txt
      102,zhangyao,CTO
      103,Alex,COO
      104,yy,CFO
      105,feixue,CIO
      
      [root@znix ~]# sed '/oldboy/d' person.txt
      102,zhangyao,CTO
      103,Alex,COO
      104,yy,CFO
      105,feixue,CIO
      复制代码
    •  

      1.2 sed的替换

    • s为 sub(substitute)替换

      g  global  表示全局替换

      1.2.1 将oldboy替换程oldboyedu

      &表示前面找到的东西。

    • &表示前面找到的东西。

      复制代码
      [root@znix ~]# sed 's#oldboy#&edu#g' person.txt
      101,oldboyedu,CEO
      102,zhangyao,CTO
      103,Alex,COO
      104,yy,CFO
      105,feixue,CIO
      复制代码

      1.2.2 把文件中的数字都替换成<num>样式。

      [root@znix ~]# sed 's#[0-9]#<&>#g' person.txt
      <1><0><1>,oldboy,CEO
      <1><0><2>,zhangyao,CTO
      <1><0><3>,Alex,COO
      <1><0><4>,yy,CFO
      <1><0><5>,feixue,CIO

             g表示把sed命令找到的内容进行替换,不加g 只替换找到的第一个。

      复制代码
      [root@znix ~]# sed 's#[0-9]#<&>#' person.txt
      <1>01,oldboy,CEO
      <1>02,zhangyao,CTO
      <1>03,Alex,COO
      <1>04,yy,CFO
      <1>05,feixue,CIO
      复制代码

      1.2.3 把前面正则表达式找到的第二列内容进行替换

      复制代码
      [root@znix ~]# sed 's#[0-9]#<&>#2' person.txt
      1<0>1,oldboy,CEO
      1<0>2,zhangyao,CTO
      1<0>3,Alex,COO
      1<0>4,yy,CFO
      1<0>5,feixue,CIO
      复制代码

      1.2.4 把前面正则表达式找到的第二列以后内容进行替换

      复制代码
      [root@znix ~]# sed 's#[0-9]#<&>#2g' person.txt
      1<0><1>,oldboy,CEO
      1<0><2>,zhangyao,CTO
      1<0><3>,Alex,COO
      1<0><4>,yy,CFO
      1<0><5>,feixue,CIO
      复制代码

      1.3 单引号 双引号 不加引号的区别

    • 1.3.1 单引号: 所见即所得

      [root@znix ~]# echo '$LANG $(hostname) {1..3}'
      $LANG $(hostname) {1..3}

      1.3.2 双引号: 对特殊符号进行解析

      [root@znix ~]# echo "$LANG $(hostname) {1..3}"
      en_US.UTF-8 znix {1..3}

      1.3.3 不加引号:支持通配符

      [root@znix ~]# echo $LANG $(hostname) {1..3}
      en_US.UTF-8 znix 1 2 3

      1.4 sed与变量

      1.4.1 在变量中放入一行内容

      [root@znix ~]# a=hello
      [root@znix ~]# a='hello world'
      [root@znix ~]# echo $a
      hello world

      1.4.2 查看下文件的内容

      复制代码
      [root@znix ~]# cat person.txt
      101,oldboy,CEO
      102,zhangyao,CTO
      103,Alex,COO
      104,yy,CFO
      105,feixue,CIO
      复制代码

      1.4.3 定义一个变量,对变量进行替换

      双引号里面,能够对变量进行解析

      复制代码
      [root@znix ~]# sub=oldboy
      [root@znix ~]# sed "s#$sub#znix#g" person.txt
      101,znix,CEO
      102,zhangyao,CTO
      103,Alex,COO
      104,yy,CFO
      105,feixue,CIO
      复制代码

      1.4.4 将两个变量分别放置,用变量替换变量。

      复制代码
      [root@znix ~]# sub=oldboy
      [root@znix ~]# aim=znix
      [root@znix ~]# sed "s#$sub#$aim#g" person.txt
      101,znix,CEO
      102,zhangyao,CTO
      103,Alex,COO
      104,yy,CFO
      105,feixue,CIO
      复制代码

      1.5 【企业案例】系统开机启动项优化

    • 将chkconfig中的除 sshd|network|crond|rsyslog|sysstat 之外的全部关闭。

      1.5.1 各项服务的含义

      复制代码
      crond   定时任务
      sshd    远程连接服务
      network 网络
      sysstat 系统工具
      rsyslog 系统日志服务 system log
              centos 6.x 7.x 中系统日志服务为rsyslog
              centos 5.x 里面系统日志服务为 syslog
      复制代码

      1.5.2 第一步把想要保留的排除走

      复制代码
      [root@znix ~]# chkconfig |sed -r  '/sshd|network|crond|rsyslog|sysstat/d'
      abrt-ccpp      0:off   1:off   2:off   3:off   4:off   5:off   6:off
      abrtd          0:off   1:off   2:off   3:off   4:off   5:off   6:off
      acpid          0:off   1:off   2:off   3:off   4:off   5:off   6:off
      atd            0:off   1:off   2:off   3:off   4:off   5:off   6:off
      auditd         0:off   1:off   2:off   3:off   4:off   5:off   6:off
      blk-availability    0:off   1:on    2:off   3:off   4:off   5:off   6:off
      cpuspeed       0:off   1:on    2:off   3:off   4:off   5:off   6:off
      ……
      复制代码

      1.5.3 第二步取出服务的名字

      复制代码
      [root@znix ~]# chkconfig |sed -r  '/sshd|network|crond|rsyslog|sysstat/d'|sed -r 's#(^.*)0:.*#1#g'  
      abrt-ccpp     
      abrtd         
      acpid         
      atd           
      auditd        
      blk-availability   
      cpuspeed      
      ……
      复制代码

      1.5.4 第三步拼接出想要的形状

      复制代码
      [root@znix ~]# chkconfig |sed -r  '/sshd|network|crond|rsyslog|sysstat/d'|sed -r 's#(^.*)0:.*#chkconfig 1 off #g'
      chkconfig abrt-ccpp          off
      chkconfig abrtd              off
      chkconfig acpid              off
      chkconfig atd                off
      chkconfig auditd             off
      chkconfig blk-availability  off
      ……
      复制代码

      1.5.5 第四步交给bash执行

      [root@znix ~]# chkconfig |sed -r  '/sshd|network|crond|rsyslog|sysstat/d'|sed -r 's#(^.*)0:.*#1#g|bash

      1.5.6 第五步检查结果

      复制代码
      [root@znix ~]# chkconfig |grep "3:on"
      crond          0:off   1:off   2:on    3:on    4:on    5:on    6:off
      network        0:off   1:off   2:on    3:on    4:on    5:on    6:off
      rsyslog        0:off   1:off   2:on    3:on    4:on    5:on    6:off
      sshd           0:off   1:off   2:on    3:on    4:on    5:on    6:off
      sysstat        0:off   1:on    2:on    3:on    4:on    5:on    6:off
      复制代码

      1.5.7 简化命令

      1.5.7.1 示例一:

      [root@znix ~]# chkconfig |sed -r '/sshd|network|crond|rsyslog|sysstat/d;s#(^.*)0:.*#chkconfig 1 off#g'|bash 

      1.5.7.2 示例二

      [root@znix ~]# chkconfig |sed -rn '/sshd|network|crond|rsyslog|sysstat/!s#^(.*)0:.*#chkconfig 1 off#gp'|bash 

      1.6 &符号的使用

      &符号找东西会把剩下的显示出来

    • 复制代码
      [root@znix ~]# echo oldboy123
      oldboy123
      
      [root@znix ~]# echo oldboy123|sed 's#.*1#&#g'
      oldboy123
      
      [root@znix ~]# echo oldboy123|sed 's#.*1#{&}#g'
      {oldboy1}23
      复制代码

      1.7 【练习题】把person.txt 中包含yy的行 这一行里面的数字替换为空

      1.7.1 文件内容

      复制代码
      [root@znix ~]# cat person.txt
      101,oldboy,CEO
      102,zhangyao,CTO
      103,Alex,COO
      104,yy,CFO
      105,feixue,CIO
      复制代码

      1.7.2 /yy/查找yy这行,使用s###g对文件内容进行替换

      复制代码
      [root@znix ~]# sed -r '/yy/s#[0-9]##g' person.txt
      101,oldboy,CEO
      102,zhangyao,CTO
      103,Alex,COO
      ,yy,CFO
      105,feixue,CIO
      复制代码

      1.7.3 将不包含yy的行进行替换

      -n 取消默认输出,所以yy那一行不会输出

      [root@znix ~]# sed -rn '/yy/!s#[0-9]##gp' person.txt
      ,oldboy,CEO
      ,zhangyao,CTO
      ,Alex,COO
      ,feixue,CIO

      1.8 查看sed更多的帮助信息【info】

      [root@znix ~]# info sed
      faq 经常遇到的问题,经常有人问的问题

      1.9sed 基本用法

    ##查找某一行 指定行号
    
    [root@jiejing ~]# sed -n '3p' person.txt
    
    103,Alex,COO
    
    查找某一行 模糊
    
     [root@jiejing ~]# sed -n '/yy/p' person.txt
    
    104,yy,CFO
    
    查找连续的行 指定行号
    
    [root@oldboyedu-40 ~]# sed -n '3,5p' person.txt
    
    103,Alex,COO
    
    104,yy,CFO
    
    105,feixue,CIO
    
    查找连续的行 模糊
    
    [root@jiejing ~]# sed -n '/101/,/103/p' person.txt
    
    101,oldboy,CEO
    
    102,zhangyao,CTO
    
    103,Alex,COO
    
    找东西要精确用正则
    
    [root@jiejing ~]# seq 0 2 20 |sed -n '/0/,/10/p'
    
    0
    
    2
    
    4
    
    6
    
    8
    
    10
    
    20
    
    [root@jiejing ~]# seq 0 2 20 |sed -n '/^0/,/10/p'
    
    0
    
    2
    
    4
    
    6
    
    8
    
    10
    
     
    
    显示文件的最后一行
    
    [root@jiejing ~]# sed -n '$p' person.txt
    
    105,feixue,CIO
    
    显示某几行
    
    [root@jiejing ~]# sed -n '1p;3p;5p' person.txt
    
    101,oldboy,CEO
    
    103,Alex,COO
    
    105,feixue,CIO

    1.10 sed 追加内容

    i 插入追加
    我们想在文件中放入新的内容
    方法1   [root@jiejing ~]# echo "106.lli.hhk" >> person.txt  
    方法2   cat >> person.txt << eof
    方法3   sed  i /a
    #i === insert 插入某一行的上一行
     #a === append 追加到某一行的下面
    [root@jiejing ~]# sed '3i 103,hkl' person.txt   i 在上面插入
    101,oldboy,CEO
    102,zhangyao,CTO
    103,hkl
    103,Alex,COO
     [root@jiejing ~]# sed '2aoldboy' person.txt  a追加到后面
    101,oldboy,CEO
    102,zhangyao,CTO
    oldboy
    103,Alex,COO
    要想内容生效在sed 后加参数 –i
    sed  -i  '3i 103,hkl' person.txt

    第2章 shell 编程

    2.1 什么是shell

           命令大礼包

           判断 循环

    2.1.1 shell的作用:    

           为重复性的工作节约时间,省事

    2.2 如何查看当前用户的命令解释器

    [root@znix ~]# echo $SHELL
    /bin/bash

    2.2.1.1 shell修改为 sh 会有一些问题

    [root@znix ~]# sh
    sh-4.1# bash
    
    [root@znix ~]#

    2.3 书写shell脚本的要求

    位置统一存放,便于管理

    [root@znix scripts]# pwd
    /server/scripts

    脚本内容

    复制代码
    [root@znix scripts]# vim show.sh
    #!/bin/bash    ##使用的命令解释器
    #filename:show.sh  ##文件名
    #desc: miaoshu      ##描述
    
    /sbin/ifconfig eth0|awk -F "[: ]+" 'NR==2{print $4}'
    复制代码

    脚本中尽量使用命令的绝对路径

    [root@znix scripts]# sh show.sh
    10.0.0.201

    2.4 shell脚本之变量

    2.4.1 什么是变量

    举个栗子:

    znix                变量的名字
    $znix               查看变量里的内容
    znix="access"       修改变量的内容

           修改变量的时候最好使用引号将内容引起来。

    2.4.2 环境变量(全局变量)

    2.4.2.1 特点

    1)大写

    2)在linux里面都生效

    2.4.2.2 查看系统中的环境变量

    使用env命令,可以列出系统中,所有的变量

    复制代码
    [root@znix scripts]# env
    HOSTNAME=znix
    TERM=linux
    SHELL=/bin/bash
    HISTSIZE=1000
    SSH_CLIENT=10.0.0.1 3156 22
    SSH_TTY=/dev/pts/1
    USER=root
    ……
    复制代码

    2.5 手动创建一个环境变量

    2.5.1 创建一个普通变量

    [root@znix scripts]# ZNIX=clsn
    [root@znix scripts]# echo $ZNIX
    clsn

    2.5.2 临时创建环境变量

    关键:export 是创建环境变量使用的

    [root@znix scripts]# export ZNIX=clsn
    [root@znix scripts]# env|grep clsn
    ZNIX=clsn

    2.5.3 让环境变量永久生效

    2.5.3.1 将 export ZNIX=clsn 放入 /etc/profile

    [root@znix scripts]# echo 'export ZNIX=clsn' >> /etc/profile

    2.5.3.2 让写入的内容生效 ,使用source /etc/profile

    [root@znix scripts]# source /etc/profile

    2.6 shell脚本与变量

    2.6.1 脚本的内容:

    [root@znix scripts]# cat show2.sh
    
    #!/bin/bash
    
    echo $a

    2.6.2 shell与普通变量

    只在当前的shell中生效,执行脚本的时候,很产生一个新的shell环境(子shell)。普通变量不能对系统中其他的shell环境产生影响,普通变量没用了。

    [root@znix scripts]# a=100
    
    [root@znix scripts]# sh show2.sh

    2.6.3 shell与全局变量

    全局变量对系统中所有的shell环境都有效,export 在系统任何一个地方都承认他。

    [root@znix scripts]# export a=100
    [root@znix scripts]# sh show2.sh
    100

    2.7 与用户有关的环境变量配置文件/目录

    /etc/motd 用户登陆到系统后显示的信息

    2.7.1 全局环境变量配置文件

        /etc/profile
        /etc/bashrc
        /etc/profile.d/     (目录)

    2.7.2 用户环境变量

        ~/.bash_proflie
        ~/.bashrc

    2.8 变量命名规则

    变量名可以是字母、数字或下划线 的组合。

           但是不能是以数字开头。    

    可以以下划线开头。

    2.8.1 取变量的时候将变量用{ } 包起来

    复制代码
    [root@znix ~]# www=123
    [root@znix ~]# echo $www
    123
    
    [root@znix ~]# echo $wwwday
    [root@znix ~]# echo ${www}day
    123day
    复制代码

    2.9 shell中的特殊变量

    2.9.1 $数字 与 $0

    复制代码
    [root@znix scripts]# cat para.sh
    #!/bin/bash
    echo $1 $2 $3 ... $0
    
    [root@znix scripts]# sh para.sh  a b c
    a b c ... para.sh
    复制代码

    $1  添加到Shell的各参数值。$1是第1参数、$2是第2参数

    $0  脚本文件的名字

    2.9.2 [练习] 使用变量写一个简单的计算器。

    2.9.2.1 先写出一个模板。

    复制代码
    [root@znix scripts]# cat  cal.sh
    #!/bin/bash
    
    echo 1+2|bc
    
    [root@znix scripts]# sh cal.sh
    3
    复制代码

    2.9.2.2 将期中的内容替换成为变量

    复制代码
    [root@znix scripts]# cat  cal.sh
    #!/bin/bash
    
    echo $1 + $2|bc
    
    [root@znix scripts]# sh cal.sh 100 50
    150
    复制代码

    2.9.2.3 将里面的计算方式增加。

    复制代码
    [root@znix scripts]# vim cal.sh
    #!/bin/bash
    echo $1 + $2|bc
    echo $1 - $2|bc
    echo $1*$2|bc      ### *在这里有不能有空格
    echo $1 / $2|bc
    echo $1 ^ $2|bc
    复制代码

    2.9.2.4 执行脚本,进行计算。

    [root@znix scripts]# sh  cal.sh  4 6
    10
    -2
    24
    0
    4096

    2.9.3 awk的计算方法

    2.9.3.1 awk使用 -v 参数 指定变量。

    [root@znix scripts]# awk -va=1 -vb=10 'BEGIN{print a/b }'
    0.1

    2.9.3.2 将awk命令放入脚本中

    复制代码
    [root@znix scripts]# tail -2 cal.sh
    #!/bin/bash
    a=$1
    b=$2
    
    awk -vnum1=$a -vnum2=$b 'BEGIN{print num1/num2}'
    复制代码

    2.9.3.3 测试脚本,检查脚本的执行结果。

    [root@znix scripts]# sh cal.sh 10 23
    0.434783

    第3章 vim 高级使用技巧

    3.1 vim中进行查找替换

    命令

    含义

    :4,s#s#1#$a#g     

    从第4行到最后一行进行替换   

    :5,s#s#1#$a#g    

    从第5行到最后一行进行替换

    :1,s#s#1#$a#g    

    从第一行到最后一行进行替换

    :%s#1#1#a#g      

    从第一行到最后一行进行替换

    :.s,$s#echo#sed#g 

    从当前行到最后一行(. 表示当前行)

     3.2 vim 快捷键

    ctrl + v    按d批量删除

    ctrl + v    按x批量删除

    dd        删除光标所在行

    dG       删除光标所在行到最后一行

    D        光标所在位置到行尾的内容

    x         删除光标所在位置的一个字符

    vim命令粘贴带#号或注释信息格式会出现混乱情况解决?

    问题说明:
      每次复制代码时,如果代码里有 //或# 这样的注释就容易让格式乱掉,显示的内容不整齐,并不是所期望的显示格式。

    原因分析:
      是由于vim编辑命令的自动缩进功能所影响,因此粘贴带注释的代码时可以取消自动缩进

    问题解决:
      vim在粘贴代码时会自动缩进,把代码搞得一团糟糕,甚至可能因为某行的一个注释造成后面的代码全部被注释掉;最初的解决办法为:用vi去打开文件再粘贴上去,但其实是可以对vim编辑器进行设置修改的。

    vim clsn.txt #<--编辑一个文件
    :set paste #<--在vim的命令行模式输入,关闭vim缩进功能

      说明:然后再进入插入模式粘贴,代码就不会被自动缩进了,可以敲代码的时候需要自动缩进,所以还需要改回来

    :set nopaste #<--开启vim缩进功能

      比较方便的方法就是修改用户家目录下的 .vimrc配置文件:

    set pastetoggle=<F9>

      说明:

        以后在插入模式下,只要按F9键就可以快速切换自动缩进模式了

     用sed和awk实现将文本中的上下两行合并为一行

      文本内容

    [root@MongoDB tmp]# cat -n /tmp/test.txt 
         1    bss_data 1
         2    Data  1 2 3 4 5 6 7 
         3    bss_data 2
         4    Data  1 2 3 4 5 6 7 

      使用sed命令实现

    [root@MongoDB tmp]#  sed -n '{N;s#
    #	#p}' test.txt|cat -n 
         1    bss_data 1    Data  1 2 3 4 5 6 7 
         2    bss_data 2    Data  1 2 3 4 5 6 7 

      N 命令,将下一行读入并附加到当前行后面,以 (换行符)分隔,一起存在模式缓冲区内。

      awk命令实现

    [root@MongoDB tmp]# awk '{tmp=$0;getline;print tmp"	"$0}' test.txt|cat -n
         1    bss_data 1    Data  1 2 3 4 5 6 7 
         2    bss_data 2    Data  1 2 3 4 5 6 7 
  • 相关阅读:
    智课雅思词汇---十八、前缀peri是什么意思
    新东方雅思词汇---7.1、probation
    智课雅思词汇---十七、前綴il-, in-, ir-, im-有什麼關係
    英语发音规则---U字母-[复习中]
    英语发音规则---O字母
    Android之Http沟通——4.Android HTTP索取信息:HttpClient
    一步一步的理解C++STL迭代器
    Java学习之路:ArrayList用法
    LeetCode:Remove Duplicates from Sorted Array
    【Struts2学习笔记(2)】Action默认值和配置Action于result各种转发类型
  • 原文地址:https://www.cnblogs.com/yzrw/p/8243045.html
Copyright © 2011-2022 走看看