1. 程式人生 > >三大搜索利器 -- sed

三大搜索利器 -- sed

.... inf family 字符串 ech 放置 login sshd fig

  • 自動處理文件;
  • 分析日誌文件;
  • 修改配置文件;

流處理編輯器 ( 過程 )


  • 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      // 替換每行所有匹配的字符串;

操作實例


// ------------------------------- 案例 一 -------------------------------------
‘‘‘ 修改 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命令,用;分開‘‘‘
    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 :轉換為大寫/小寫字符)‘‘‘ [[email protected] test]# ls all.txt qq.txt text.txt [[email protected] 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 總結


技術分享圖片

三大搜索利器 -- sed