shell编程之sed

sed命令

文本处理三剑客:
    grep,egrep,fgrep:文本过滤器
    sed:流编辑器,以行为单位
    awk:文本格式化工具,报告生成器
    
sed [OPTION]... {script-only-if-no-other-script} [file]...

常用选项:
        -n:不打印没关系的行;不输出模式空间的内容至屏幕;
        -e:多点编辑;连接多个命令同时处理;也可以用分号";"隔开
        -f:指定脚本文件,并将脚本应用到文件;
            脚本文件的内容,每行一个命令;
                cat sed.rules
                    s/this/THAT/g
                    /^$/d
                sed -f sed.rules sed.text    
        -r:支持使用扩展正则表达式;
        -i:直接修改原文件;可以用-i.bak参数备份原文件;
            sed –i.bak ‘s/dog/cat/g’ pets
        
    地址定界:
        (1)不给地址:对全文进行处理;
        (2)单地址:
            #:指定第几行;
            /PATTERN/:被此模式匹配到的每一行;
        (3)    地址范围:
            #,#:第几行到第几行;
            #,+#:第几行到+#行;
            #,/PAT1/:第几行到第一次匹配到PAT1的行;
            /PAT1/,/PAT2/:第一次匹配到PAT1的行到第一次匹配到PAT2的行;
            $:最后一行;
        (4)步进:~
            1~2:所有奇数行;
            2~1:所有偶数行;
            
    编辑命令:
        d:删除
            sed ‘1,5d‘ /etc/fstab
        p:打印,必须使用-n参数;    
            ifconfig | sed -n ‘2p‘ 显示第二行
            sed ‘1~2p‘ /etc/fstab 奇数行会显示2次
            sed -n ‘1~2p‘ /etc/fstab 只显示奇数行
            sed ‘1~2d‘ /etc/fstab 显示偶数行
        i\text:在行前面插入文本"text",支持使用\n实现多行插入;
            sed ‘3 i \new line‘ /etc/fstab 在第三行前面插入new line
            sed ‘3 i \new line\nanother new line‘ /etc/fstab
        a\text:在行后面追加文本"text",支持使用\n实现多行追加;
            sed ‘3 a \new line‘ /etc/fstab 在第三行后面插入new line
            sed ‘/UUID/ a \new line‘ /etc/fstab 在包含UUID的行后面插入new line
        c\text:把匹配到的行替换为此处指定的文本"text",注意是整行替换;    
        w:保存匹配到的结果到指定位置;
            sed -n ‘/^[^#]/p‘ /etc/fstab
            sed ‘/^[^#]/w /tmp/fstab.new‘ /etc/fstab
        r:从其它文件读取文本,并插入匹配行之后;文件合并;
            sed ‘3 r /etc/issue‘ /etc/fstab
        =:为匹配到的行打印行号;
            sed ‘/^UUID/=‘ /etc/fstab
        !:条件取反;
            sed ‘/^[^#]/d‘ /etc/fstab 删除非#开头的行
            sed ‘/^#/!d‘ /etc/fstab 删除非#开头的行
            sed ‘5!d‘ /etc/fstab 只保留第5行(处理未匹配到的行)
            s///:查找替换,其分隔符可自行指定,常用的有[email protected]@@,s###等;
            默认情况只替换第一次匹配到的内容;
                sed ‘s/line/LINE‘
            要想每行最多匹配2个,可使用/2
                sed ‘s/line/LINE/2‘
            替换标记:
                g:全局替换;
                p:显示替换成功的行;
                w:将替换成功的结果保存至指定文件中;                    
        &:引用前面搜索到的整个内容;
            查找替换命令为/tmp/functions文件的每个以空白字符开头的行的行首加上#;
            :%[email protected]^[[:space:]]@#&@g
        \(\):后向引用,引用分组;如s/\(love\)able/\1r,loveable替换成lovers;
                
    练习:
        1、删除/etc/prelink.conf.d/grub2.conf文件中所有以空白字符开头的行的行首的空白字符;
            sed ‘[email protected]^[[:space:]]\[email protected]@‘ /etc/prelink.conf.d/grub2.conf
            
        2、删除/etc/fstab文件中所有以#开头的行的行首的#号及#后面的所有空白字符;
            sed ‘[email protected]^#[[:space:]]*@@‘ /etc/fstab
            
        3、输出一个绝对路径给sed,取出其目录;
            echo "/var/log/messages" | sed ‘[email protected][^/]\[email protected]@‘
            echo "/var/log/messages" | sed -r ‘[email protected][^/][email protected]@‘
            
        4、在/root/install.log每一行行首增加#号;
            sed ‘[email protected]^.*@#&@‘ /root/install.log
            sed ‘[email protected]^@#@‘ /root/install.log
        
        5、在/etc/fstab文件中不以#开头的行的行首增加#号;                
            sed ‘/^#/[email protected]*@#&@‘ /etc/fstab    (处理未匹配到的行)
            sed ‘/^#/[email protected]^@#@‘ /etc/fstab
            
        6、处理/etc/fstab路径,使用sed命令取出其目录名和基名;
            echo "/etc/fstab" | sed ‘[email protected][^/]\[email protected]@‘
            echo "/etc/fstab" | sed ‘[email protected]^.*[/]@@‘
        
        7、利用sed取出ifconfig命令中本机的IPv4地址;
            ifconfig | sed -n ‘2p‘ | tr -s " " | cut -d" " -f3
            
        8、    过滤出/media/cdrom/Packages目录下rpm包的架构字段,并统计每种架构的个数;
            ls *.rpm | sed ‘[email protected]*\.\(.*\)\[email protected]\[email protected]‘ | sort | uniq -c
            ls *.rpm | sed -r ‘[email protected]*\.(.*)\[email protected]\[email protected]‘ | sort | uniq -c
            ls *.rpm | sed -r ‘[email protected]*\.(.*)\..*@\[email protected]‘ | sort | uniq -c
            ls *.rpm | rev | cut -d. -f2 | rev | sort | uniq -c
                rev:reverse lines of a file or files.把每一行反序显示;
                
        9、统计一个文件里面哪个单词重复的次数最多;
            egrep -o "[[:alpha:]]+" /etc/init.d/functions | sort | uniq -c | sort -n
            sed ‘[email protected][^[:alpha:]]@\[email protected]‘ /etc/init.d/functions | sort | uniq -c | sort -n        
            
            
高级编辑命令:
    h:把模式空间中的内容覆盖至保持空间中;
    H:把模式空间中的内容追加至保持空间中;
    g:把保持空间中的内容覆盖至模式空间中;
    G:把保持空间中的内容追加至模式空间中;
    x:把模式空间中的内容与保持空间中的内容互换;
    n:覆盖读取匹配到的行的下一行至模式空间中;读取下一个输入行,用下一个命令处理新的行;
    N:追加读取匹配到的行的下一行至模式空间中;
    d:删除模式空间中的行;
    D:删除多行模式空间中的所有行;
    
    示例:
        sed -n ‘n;p‘ file:显示偶数行;
        sed ‘1!G;h;$!d‘ file:逆序显示文件内容;
        sed ‘$!d‘ file:取出最后一行;
        sed ‘$!N;$!D‘ file:取出后两行;
        sed ‘/^$/d;G‘ /etc/fstab:删除原有的所有空白行,而后为所有的非空白行后添加一个空白行;
        sed ‘n;d‘ file:显示奇数行;
        sed ‘G‘ file:在原有的每行后方添加一个空白行;
        sed -n ‘1!G;h;$p‘ file:逆序显示文件内容;

时间: 2024-12-21 01:44:45

shell编程之sed的相关文章

shell编程之sed语法

首先插播条广告:  想要进一个文件夹去 看下面有那些文件 必须对这个文件夹有执行权限. sed p  打印对应的行  2p 打印第二行. -n  只输出经过sed 命令处理的行 看图吧 不太会擅长言语. 第二行是打印出来但是其他的也打印出来了. 同时sed  还能放在管道符号后面  ,看图 d 删除指定的行   sed "1,2d" 删除1,2行  由此可看到 第一二行不见了.但是没有真真删除原文件里面的东西.只是在输出的时候删除了. -i 操作的同时也影响了原文件   sed -i

shell编程之array

变量 : 内存空间 类型 shell编程中所有变量类型为字符类型array 数组 数组中变量叫做element (元素) ,数组中每个元素都用索引位置来标注声明数组declare -a ARRAY_NAME赋值方法1 :AA[0]=jerry赋值方法2 :br/>AA={jerry,tom,lucy}数组实例![](https://s1.51cto.com/images/blog/201907/09/d85fa8a4c0a1da0c0a4e8975ba9d285f.png?x-oss-proce

Shell编程之Expect免交互

Shell编程之Expect免交互 Expect概述 Expect安装 Expect基本命令 Expect执行方式 Expect案例 Expect概述 Expect Expect是建立在tcl基础上的一个工具,Expect 是用来进行自动化控制和测试的工具.主要解决shell脚本中不可交互的问题.对于大规模的linux运维很有帮助 在linux运维和开发中,我们经常需要远程登录服务器进行操作,登录的过程是一个交互的过程,可能会需要输入yes/no password等信息.为了模拟这种输入,可以使

shell编程之case分支语句

shell编程之case分支语句 case分支语句和if的多分支语句很相似. if多分支语句一般用在有(区间范围)的地方 :例如:0-100之间. if需要判断多个不同的条件. case的分支语句用在 如果里面匹配到固定值:或某个变量存在多中取值,需要对其中的每一个取值分别执行不同的命令序列. case只是判断一个变量的不同取值. case的模式: 执行流程: 首先使用"变量值"与模式1进行比较,如果取值相同就执行模式1的命令序列1,直到遇见" ;; "后跳转到es

无标题文章shell编程之Expect免交互

shell编程之Expect免交互 前言 一:Expect概述 Expect是建立在tcl基础上的一个工具,Expect是用来进行自动化控制和测试的工具.主要解决shell脚本中不可交互的问题,对于大规模的linux运维很有帮助 在Linux运维和开发中,我们经常需要远程登录服务器进行操作,在登录的过程是一个交互的过程,可能会需要输入yes/no password等信息. 为了模拟这种输入,可以使用Expect脚本 二:Expect基本命令 2.1:Expect安装 系统一般不自带,需要自己安装

shell编程之if语句

目录 shell编程之if判断 1.整数比较 2.字符串比较 3.举例 1.数字比较 2.字符串比较 4.Other shell编程之if判断 1.整数比较 -eq 等于,如:if [ "$a" -eq "$b" ] -ne 不等于,如:if [ "$a" -ne "$b" ] -gt 大于,如:if [ "$a" -gt "$b" ] -ge 大于等于,如:if [ "$a&

shell编程之awk

GNU awk AWK:Aho,Weinberger,Kernighan GNU awk --> gawk#ll `which awk`    /usr/bin/awk -> gawk 报表生成器,格式化文本输出; #man awk    pattern scanning and processing language.    模式扫描和处理语言;    基本用法:    awk [option] 'program' file        program: PATTERN{ACTION ST

shell编程之grep命令的使用

大家在学习正则表达式之前,首先要明确一点,并把它牢牢记在心里,那就是: 在linux中,通配符是由shell解释的,而正则表达式则是由命令解释的,不要把二者搞混了.切记!!! 通常有三种文本处理工具/命令:grep.sed.awk,它们三者均可以解释正则.下面我就为大家介绍grep命令的使用方法. 一.使用grep命令搜索文件中的内容 grep和egrep命令能够在一个或多个文件的内容中搜索某一特定的字符模式,也被称为正则表达式(regular expressions).一个模式可以是一个单一的

Shell编程之if语法练习(LNMP)全过程

大家好,我是延凯,本人原来在CSDN写作已经快一年了 都是相关Linux运维这方面的技术知识,现在搬到博客园也是我一直想的,本博客主要写Python,docker,shell等偏向开发云计算等知识点,谢谢各位,声明:(原先的CSDN也会不定时更新Linux运维等方面的知识!) #!/bin/bash # DATE:Wed Jan 17 1# [email protected]163.com #this is a yankerp # The Nginx service is being insta