Linux基礎(day29)

sed擴展

例如:有個文件test的內容以下:
ert
fff
**
[abcfd]
123
324
444
[rty]
**
fgfgf
怎麼能截取
[abcfd]
123
324
444
[rty]
這一部分出來呢?
  • 實現:
[root@hf-01 sed]# sed -n '/\[abcfd\]/,/\[rty\]/'p 1.txt    //截取[abcfd]到[rty]之間的內容
[abcfd]
123
324
444
[rty]
[root@hf-01 sed]#
  • 這裏不能加-r 參數,只能使用 \ 脫義字符(有多是逗號 , 的存在,致使加-r 參數沒法正常所有脫義)nginx

  • 擴展知識bash

    • 查看某一段時間的日誌
      • sed -n '/03/Mar/2016:02:52/,/03/Mar/2016:03:03:20/'p /usr/local/nginx/logs/cn.log |awk '{print $1}'|sort|uniq -c|sort -rn
  • 二. sed轉換大小寫日誌

    1. 把每一個單詞的第一個小寫字母變成大寫
[root@hf-01 sed]# sed 's/\b[a-z]/\u&/'g  test.txt    //把每一個單詞的第一個小寫字母變成大寫
Root:X:0:0:Root:/Root:/Bin/Bash
Bin:X:1:1:Bin:/Bin:/Sbin/Nologin
Adas:124:Bdsf:Rto:Pass
Daemon:X:2:2:Daemon:/Sbin:/Sbin/Nologin
Dfdf:Rggo:124
等等等,只截取了一部分
[root@hf-01 sed]#
    1. 把全部小寫變成大寫
[root@hf-01 sed]# sed 's/[a-z]/\u&/'g test.txt    //把文件中全部小寫字母變成大寫
ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN
ADAS:124:BDSF:RTO:PASS
DAEMON:X:2:2:DAEMON:/SBIN:/SBIN/NOLOGIN
DFDF:RGGO:124
ADM:X:3:4:ADM:/VAR/ADM:/SBIN/NOLOGIN
等等等,只截取了一部分
[root@hf-01 sed]#
  • 在使用-i 參數後,會直接更改文件內容code

    • sed -i 's/[a-z]/\u&/'g test.txt
    1. 大寫變小寫
[root@hf-01 sed]# sed 's/[A-Z]/\l&/'g test.txt    //把文件中全部的大寫字符變成小寫
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
adas:124:bdsf:rto:pass
daemon:x:2:2:daemon:/sbin:/sbin/nologin
dfdf:rggo:124
等等等,只截取了一部分
[root@hf-01 sed]#

總結字符串

[root@hf-01 sed]# head -n1 test.txt |sed 's/\(^r.*\)/\1 12/'    //在以r 字母開頭的行,結尾處添加數字123
root:x:0:0:root:/root:/bin/bash 12
[root@hf-01 sed]# head -n1 test.txt |sed 's/\(^r.*\)/& 123/'    //在以r 字母開頭的行,結尾處添加數字123
root:x:0:0:root:/root:/bin/bash 123


[root@hf-01 sed]# head -n1 test.txt |sed 's/\(^r.*\)/1 123/'    //這裏是將以r 字母開頭的行,替換成1 123
1 123
  • 這裏的 \1 應該指的是前面 // 的內容

  • & 表示 第一個 // 裏面的內容

  • 擴展知識

    • 在含有root行前面添加字符abc字符串和一個空格
      • sed '/root/s/^/abc /' test.txt
    • 在以第一個root開頭的行到以一個bin開頭的行的後面添加abc和空格
      • sed '/^mail>/,/^ftp>/s/$/ abc/' test.txt
  • 四. 刪除某行到最後一行

  • sed刪除某關鍵字的下一行到最後一行

    • 格式 sed -i '/sample/{N;d}' filename
      • //sample是匹配字符
      • N在這裏就是下一行
      • d是刪除
    • 需求
[root@test200 ~]# cat test
a
b
c
d
e
f
[root@test200 ~]# sed '/c/{p;:a;N;$!ba;d}' test
a
b
c
  • 分析

    • 首先匹配,匹配到c這行
    • 後面定義一個標籤,開始循環,下一行一直到結尾都放到模式空間(緩衝區)
    • 而後刪除模式空間,打印出結果
      • if 匹配"c"
      • :a
      • 追加下一行
      • if 不匹配"$"
      • goto a
      • 最後退出循環,d命令刪除。
  • 五. 打印1到100行含某個字符串的行

  • 使用sed打印1到100行包含某個字符串的行

sed  -n '1,100{/abc/p}'  1.txt
  • 指定多個字符
sed -n  '1,100{/abc/p;/dd/p}' 2.txt
  • sed -n :不重複打印
  • -n和p參數一塊兒使用
相關文章
相關標籤/搜索