三大搜索利器 -- sed

sed 用途


  • 自动处理文件;
  • 分析日志文件;
  • 修改配置文件;

 

流处理编辑器 ( 过程 )


  • sed 一次处理一行内容;
  • sed 不改变文件内容 ( 除非重定向 ) 或者 -i 参数; 

             

 

sed 的使用格式


 

  • 命令行模式
    • sed  [options]  'command'  file(s) 
      • sed -n '/root/p'
      • sed -e '10,20d' -e 's/false/true/g'                         // 跟两个 sed 命令的参数;
  •  脚本格式
    • sed -f scirptfile file(s)

 

sed -- 基础命令操作


 

// 打印,  配合 -n 参数, 否则会打印全文件,并将匹配的行打印两次, 复制passwd 进行操作;

// ************************ 定位, 打印一行 ***************************
sed -n '18p' passwd                        // 打印第十行;
abrt:x:173:173::abrt:/sbin/nologin
nl passwd| sed -n '18p'                    // 使用 nl 显示行号 并打印第十行;
    18    abrt:x:173:173::abrt:/sbin/nologin
sed -n '/abrt/p' passwd                    // 使用字符串匹配打印;
abrt:x:173:173::abrt:/sbin/nologin

// ************************* 定位多行 *****************************
nl passwd |sed -n '18,20p'                    // 使用行号匹配;
    18    abrt:x:173:173::abrt:/sbin/nologin
    19    haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
    20    ntp:x:38:38::ntp:/sbin/nologin
nl passwd |sed -n '/abrt/,20p'                // 前面使用字符串, 后面使用行数;
    18    abrt:x:173:173::abrt:/sbin/nologin
    19    haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
    20    ntp:x:38:38::ntp:/sbin/nologin
nl passwd |sed -n '18,/ntp/p'                // 前面使用行数, 后面使用字符串;
    18    abrt:x:173:173::abrt:/sbin/nologin
    19    haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
    20    ntp:x:38:38::ntp:/sbin/nologin
nl passwd |sed -n '/abrt/,/ntp/p'            // 使用字符串进行匹配;
    18    abrt:x:173:173::abrt:/sbin/nologin
    19    haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
    20    ntp:x:38:38::ntp:/sbin/nologin
    
// ************************** 定位取反 *****************************
sed -n '/root/!p' passwd
    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
    ... ...
nl passwd |sed -n '1,27!p'                    // 可是使用上面的任何一种匹配方式;
    28    tian:x:502:502::/home/tian:/bin/bash
    
// ************************** 定为间隔几行 ********************************
nl passwd |sed -n '2~10p'                    // 2~10 表示 从第二行开始, 间隔 10行;
     2    bin:x:1:1:bin:/bin:/sbin/nologin
    12    games:x:12:100:games:/usr/games:/sbin/nologin
    22    postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    
// ************************** 选定行下添加一行 "a" *****************************
nl passwd |sed '1a ++++++++++++++++++'
     1    root:x:0:0:root:/root:/bin/bash
        ++++++++++++++++++
     2    bin:x:1:1:bin:/bin:/sbin/nologin
        ... ...
nl passwd |sed '1,3a ++++++++++++++++++'            // 1 到 3 行, 每行后插入
     1    root:x:0:0:root:/root:/bin/bash
        ++++++++++++++++++
     2    bin:x:1:1:bin:/bin:/sbin/nologin
        ++++++++++++++++++
     3    daemon:x:2:2:daemon:/sbin:/sbin/nologin
        ++++++++++++++++++
     4    adm:x:3:4:adm:/var/adm:/sbin/nologin
     5    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin    
        ... ...
        
// *************************** 选定行上一行添加一行 "i" *******************************
nl passwd |sed '1i ++++++++++++++++++++'
        ++++++++++++++++++++
     1    root:x:0:0:root:/root:/bin/bash
        ... ...
nl passwd |sed '1,3i +++++++++++++++++++++'
        +++++++++++++++++++++
     1    root:x:0:0:root:/root:/bin/bash
        +++++++++++++++++++++
     2    bin:x:1:1:bin:/bin:/sbin/nologin
        +++++++++++++++++++++
     3    daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4    adm:x:3:4:adm:/var/adm:/sbin/nologin
        ... ...
     
// **************************** 替换当前行 "c" ******************************
nl passwd |sed '1c tian'        // 将当前行替换为 tian;
        tian
     2    bin:x:1:1:bin:/bin:/sbin/nologin
        ... ...
nl passwd |sed '1,3c tianfei'        // 将连续多行替换;
        tianfei
     4    adm:x:3:4:adm:/var/adm:/sbin/nologin
     5    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
        ... ...
        
// **************************** 删除指定行 "d" ********************************
nl passwd |sed '1d'                    // 删除 一行;
     2    bin:x:1:1:bin:/bin:/sbin/nologin
     3    daemon:x:2:2:daemon:/sbin:/sbin/nologin
        ... ...
nl passwd |sed '1,25d'                // 删除多行;
    26    apache:x:48:48:Apache:/var/www:/sbin/nologin
    27    zxjr:x:501:501:Apache:/home/zxjr:/bin/bash

// **************************** 替换文件中指定内容 "s" ********************************
** 全局替换(g)
  sed 's/nologin/bash/' passwd   // 每行只替换匹配到的第一个;
  sed 's/:/%/g' passwd        // 替换每行所有匹配的字符串;
 
 // ************************* 同一行修改多个内容 "-e" ***************************
 sed -e '/#Port/ s/#//' -e 's/22/$port/' /etc/ssh/sshd_config >/dev/null 2>&1

 

 操作实例


 

// ------------------------------- 案例 一 -------------------------------------
''' 修改 sshd 配置文件, 修改 ssh 端口号; 禁止 root 直接远程登录; 禁止空密码. '''
sed -i '$a \\tPort 52113\n\tPermitRootLogin no\n\tPermitEmptyPasswords no' /etc/ssh/sshd_config     // 直接更改配置文件;
// "$"表示文本的最后,若要加入空格的话,$a后面需要使用'\'进行转义空格,剩下的几行不需要转义,直接加空格就行;

// -------------------------------- 案例 二 ------------------------------------
''' 删除文本中的空行 '''
sed '/^$/d' passwd

// -------------------------------- 案例 三 ------------------------------------
''' 服务器 log 中 找出 error 日志 '''
sed -n '/Error/p' /var/log/messages

// -------------------------------- 案例 四 ------------------------------------
''' 获取网卡的 ip '''
 ifconfig eth0 |sed -n '/inet /p'|sed 's/inet.*r://'|sed  's/ Bcast.*0//'
 ip a|sed -n '/\/24/p'|sed 's/i.*t //'|sed 's/\/24.*0//'
 
// ------------------------------ 案例 五 --------------------------------
 
'''sed中引用变量''' 变量使用单引号引起来
State=$(cat /etc/selinux/config |grep ^SELINUX= |awk -F "=" '{print $2}')
sed -i '/^SELINUX=/ s/'$State'/disabled/' /etc/selinux/config
 

 

 

高级操作命令及案例


 

 

// 操作命令一
    '''{}: 多个sed命令,用;分开'''
    cat -n passwd |sed '{1,6d;s/:/%/g}'
     7  adm%x%3%4%adm%/var/adm%/sbin/nologin
     ......
    
// 操作命令二
    ''' -n : 读取下一个输入行(用下一个命令处理);n可多次使用,放置到不同的位置;'''
    cat -n passwd |sed -n '{n;p}'  // 隔一行一输出,偶数行;
    cat -n passwd |sed -n '2~2p'   // 效果相同;
     2  
     4  
     6  
    cat -n passwd | sed -n '{p;n}' // 隔一行一输出,奇数行;
    cat -n passwd |sed -n '1~2p'   // 效果相同;
     1  root:x:0:0:root:/root:/bin/bash
     3  bin:x:1:1:bin:/bin:/sbin/nologin
     5  daemon:x:2:2:daemon:/sbin:/sbin/nologin

// 操作命令三
    ''' & : 替换固定字符串'''
    cat -n passwd |sed  's/[a-z_-]\+/&   /'
     1  root   :x:0:0:root:/root:/bin/bash
     2  
     3  bin   :x:1:1:bin:/bin:/sbin/nologin
     ......
    
    // ************************** 案例一: 大小写转换 *****************************
    ''' 将用户名的首字母转换为大写/小写
        (元字符\u \l \U \L: 转换为大写/小写字符)
        小写的是对首字母的转换;大写是对一整串的转换;'''
    cat passwd |sed 's/^[a-z]\+/\u&/'  // 将首字母大写
        Root:x:0:0:root:/root:/bin/bash
        ......
    
    // ************************** 案例二: 大小写转换 *****************************
    ''' 将文件夹下的.txt文件名转换为大写
    
(元字符\u \l \U \L :转换为大写/小写字符)''' [root@server test]# ls all.txt qq.txt text.txt [root@server test]# ls *.txt |sed 's/\w\+/\U&/' ALL.txt QQ.txt TEXT.txt // ************************** 案例三: 数据筛选 ****************************** ''' 获取passwd中的USER UID 和 GID '''
   // 以[a-zA-Z]开头; \+ 表示一位以上;    后面 1, 2, 3 调用前面 () 中的内容;
sed 's/\(^[a-zA-Z]\+\):x:\([0-9]\+\):\([0-9]\+\):.*$/\1---\2---\3/' passwd // 操作命令四 ''' \( \) : 替换某种(部分)字符串(\1,\2) 通过\1,\2调用''' // ************************** 案例一: 数据晒酸 ****************************** ''' 获取eth0的ip ''' ifconfig eth0 |grep 'inet ' |sed 's/[a-z :]\+\([0-9.]\+\).*$/\1/' 192.168.9.30 ip a |sed -n '/\/24/p' | sed 's/^[ a-z]\+\([0-9.]\+\).*$/\1/' 192.168.9.30 // 操作命令五 ''' r : 复制指定文件插入到匹配行(不改变文件内容); w : 复制匹配行拷贝到指定文件中''' // 生成两个文件,方便操作,一个里面全是数字,另一个里面全是字母; echo -e '12341234\n892743278328\n917483' > 123.txt cat 123.txt 12341234 892743278328 917483 echo -e 'sdadjkj\njsdafkj\njsdlkfj'>abc.txt cat abc.txt sdadjkj jsdafkj jsdlkfj sed '1r 123.txt' abc.txt // 读取123.txt文件,放入abc.txt文件中第一行后面; sdadjkj 12341234 892743278328 917483 jsdafkj jsdlkfj sed '1w abc.txt' 123.txt // 将123.txt文件的第一行内容拷贝到abc文件中的第一行,修改abc.txt文件; 12341234 892743278328 917483 cat abc.txt 12341234 // 操作命令六 ''' q : 退出sed(可提前退出)''' cat -n passwd |sed '3q' // 只打印三行,之后直接退出; 1 Root:x:0:0:root:/root:/bin/bash 2 Bin:x:1:1:bin:/bin:/sbin/nologin 3 Daemon:x:2:2:daemon:/sbin:/sbin/nologin


 

 

sed 总结


 

                     

 

posted @ 2019-04-17 16:29  荣荣很乖  阅读(469)  评论(0编辑  收藏  举报