美文网首页
Shell编程—【07】Linux的sed流编辑器 sed命令

Shell编程—【07】Linux的sed流编辑器 sed命令

作者: 苡仁ilss | 来源:发表于2020-01-11 15:42 被阅读0次

    介绍

    • sed(Stream Editor), 流编辑器。 对标准输出或者文件逐行进行处理。

    语法格式

    • 标准输出处理
    sed [选项]... {脚本} [文件]...
    
    • 文件处理
    stdout | sed [选项]... {脚本}
    

    文件

    • 下面命令将在含有file文件内容如下的目录下进行。
    i love python
    lovelove python
    loooove
    I LOVE PYTHON
    I LOVE pYtHoN
    py.*
    

    sed的选项使用案例

    无参数直接使用p(打印)命令

    sed "p" file
    
    i love python
    i love python
    lovelove python
    lovelove python
    loooove
    loooove
    I LOVE PYTHON
    I LOVE PYTHON
    I LOVE pYtHoN
    I LOVE pYtHoN
    py.*
    py.*
    

    -n 取消自动打印模式空

    • 可能大家会有点蒙是什么意思,这句话是centOS7中世界输入sed给的提示。
    • 首先解释一下,使用sed命令时,会先自动打印原来的文本,再输出匹配文本处理结果。
    • -n大家可以简单理解不输出原文本,只输出结果。
    • 示例:
    sed -n "p" file
    
    i love python
    lovelove python
    loooove
    I LOVE PYTHON
    I LOVE pYtHoN
    py.*
    
    • 打印匹配项
    sed -n "/python/p" file
    
    i love python
    lovelove python
    

    -e 脚本, 添加“脚本”到程序的运行列表

    • 就是在逐行处理的时候匹配有多种情况,只有一个不用写-e
    • 如 匹配大写的和小写的
    sed -n -e '/python/p' -e '/PYTHON/p' file
    
    i love python
    lovelove python
    I LOVE PYTHON
    

    -r 使用拓展正则表达式

    sed -nr "/python|PYTHON/p" file
    sed -nE "/python|PYTHON/p" file
    # 两种都可以
    
    i love python
    lovelove python
    I LOVE PYTHON
    

    -f 脚本文件, 添加“脚本文件”到程序的运行列表

    -i 操作源文件

    sed -i 's/love/like/g' file
    # s是替换 love变成like  g是每行的所有匹配字符,
    # 如果不加g 则会匹配到第一个符合的字符替换了就结束当前行的替换
    
    • 没有输出

    sed常用的Pattern用法

    匹配某行

    sed -n "5p" file
    
    I LOVE pYtHoN
    

    从某行开始匹配到某行

    sed -n '2,5p' file
    
    lovelove python
    loooove
    I LOVE PYTHON
    I LOVE pYtHoN
    

    从某行开始匹配 并设置一个偏移行数

    sed -n '2,+2p' file
    
    • 处理的行数是从基数开始 偏移量+1 行
    lovelove python
    loooove
    I LOVE PYTHON
    

    处理正则表达式所在的行

    sed -n '/^I LOVE/p' file
    
    I LOVE PYTHON
    I LOVE pYtHoN
    

    从匹配条件1到的行数开始到 条件2的行 结束

    sed -n "/lovelove/,/py\.\*/p" file
    
    lovelove python
    loooove
    I LOVE PYTHON
    I LOVE pYtHoN
    py.*
    

    从某行开始到 匹配条件2的行 结束

    sed -n "4,/pYtHoN/p" file
    
    I LOVE PYTHON
    I LOVE pYtHoN
    

    从匹配条件1到的行数开始到 某行 结束

    sed -n "/pYtHoN/, 6s/LOVE/love/gp" file
    
    I love pYtHoN
    

    注意: 如果是行数范围处理,结束条件如果文件中没有那么就会一直处理到最后一行

    sed -n "3,/abc/p" file
    
    loooove
    I LOVE PYTHON
    I LOVE pYtHoN
    py.*
    

    sed中的编辑命令

    p 打印 print

    a 行后追加append

    sed '/loooove/a bbbbbbbbbb' file
    
    i love python
    lovelove python
    loooove
    bbbbbbbbbb
    I LOVE PYTHON
    I LOVE pYtHoN
    py.*
    

    i 行前追加

    sed '/loooove/i aaaaaaaaa' file
    
    i love python
    lovelove python
    aaaaaaaaa
    loooove
    I LOVE PYTHON
    I LOVE pYtHoN
    py.*
    

    r 外部文件读入,行后追加

    • list文件
    1 line
    2 line
    
    sed '/lovelove/r list' file 
    
    i love python
    lovelove python
    1 line
    2 line
    loooove
    I LOVE PYTHON
    I LOVE pYtHoN
    py.*
    

    w 匹配行写入外部文件

    sed -n '/I LOVE/w aaa' file  && cat aaa```
    
    • 注意aaa可以不存在 如果以存在 里面的内容会被清除
    I LOVE PYTHON
    I LOVE pYtHoN
    

    d 删除

    sed '1,3d' file
    
    • 执行打印 并不修改源文件 修改源文件需要-i
    I LOVE PYTHON
    I LOVE pYtHoN
    py.*
    

    s/old/new 替换行内第一个old

    s/old/new/2 替换行第二个

    s/old/new/g 替换行内所有old

    s/old/new/2g 替换第二个及后面所有的

    s/old/new/ig 替换行内所有的old,忽略大小写

    • 替换命令演示
    sed 's/o/AA/i2g' file
    
    i love pythAAn
    lovelAAve pythAAn
    loAAAAAAve
    I LOVE PYTHAAN
    I LOVE pYtHAAN
    py.*
    
    sed 's/py/&OOO/ig' file
    
    • & 符号是匹配的内容的引用
    i love pyOOOthon
    lovelove pyOOOthon
    loooove
    I LOVE PYOOOTHON
    I LOVE pYOOOtHoN
    pyOOO.*
    

    sed的应用

    • 处理一个Mysql的配置文件my.conf文本,输入文章有几个段(以 [ ] 为段),每个段有几个配置,
    #!/bin/bash
    #
    
    FILE_NAME=./my.cnf
    
    function get_all_segments
    {
        echo "`sed -n '/\[.*\]/p' $FILE_NAME  | sed -e 's/\[//g' -e 's/\]//g'`"
    }
    
    function count_items_in_segment
    {
        items=`sed -n '/\['$1'\]/,/\[.*\]/p' $FILE_NAME | grep -v "^#" | grep -v "^$" | grep -v "\[.*\]"`
        
        index=0
        for item in $items
        do
            index=`expr $index + 1`
        done
    
        echo $index
    
    }
    
    number=0
    
    for segment in `get_all_segments`
    do
        number=`expr $number + 1`
        items_count=`count_items_in_segment $segment`
        echo "$number: $segment  $items_count"
    done
    
    • 文本my.conf
    # this is read by the standalone daemon and embedded servers
    [client]
    port=3306
    socket=/tmp/mysql.socket
    
    #ThisSegmentForserver
    [server]
    innodb_buffer_pool_size=91750M
    innodb_buffer_pool_instances=8
    innodb_buffer_pool_load_at_startup=1
    innodb_buffer_pool_dump_at_shutdown=1
    innodb_data_file_path=ibdata1:1G:autoextend
    innodb_flush_log_at_trx_commit=1
    innodb_log_buffer_size=32M
    innodb_log_file_size=2G
    innodb_log_files_in_group=2
    innodb_max_undo_log_size=4G
    innodb_undo_directory=undolog
    innodb_undo_tablespaces=95
    
    #thisisonlyforthemysqldstandalonedaemon
    [mysqld]
    port=3306
    socket=/tmp/mysql.sock
    basedir=/usr/local/mysql
    datadir=/data/mysql
    pid-file=/data/mysql/mysql.pid
    user=mysql
    bind-address=0.0.0.0
    sort_buffer_size=16M
    join_buffer_size=16M
    thread_cache_size=3000
    interactive_timeout=600
    wait_timeout=600
    
    #ThisSegmentFormysqld_safe
    [mysqld_safe]
    log-error=/var/log/mariadb/mariadb.log
    pid-file=/var/run/mariadb/mariadb.pid
    max_connections=1000
    open_files_limit=65535
    thread_stack=512K
    external-locking=FALSE
    max_allowed_packet=32M
    
    #thisisonlyforembeddedserver
    [embedded]
    gtid_mode=on
    enforce_gtid_consistency=1
    log_slave_updates
    slave-rows-search-algorithms='INDEX_SCAN,HASH_SCAN'
    binlog_format=row
    binlog_checksum=1
    relay_log_recovery=1
    relay-log-purge=1
    
    
    #usethisgroupforoptionsthatolderserversdon'tunderstand
    [mysqld-5.5]
    key_buffer_size=32M
    read_buffer_size=8M
    read_rnd_buffer_size=16M
    bulk_insert_buffer_size=64M
    myisam_sort_buffer_size=128M
    myisam_max_sort_file_size=10G
    myisam_repair_threads=1
    lock_wait_timeout=3600
    explicit_defaults_for_timestamp=1
    innodb_file_per_table=1
    
    

    相关文章

      网友评论

          本文标题:Shell编程—【07】Linux的sed流编辑器 sed命令

          本文链接:https://www.haomeiwen.com/subject/zoxbactx.html