07_sed

1.sed是一款流編輯工具,用來對文本進行過濾與替換工作,特別是當你想要對幾十個配置文件做統計修改時,你會感受到sed的魅力!
  sed通過輸入讀取文件內容,但一次僅讀取一行內容進行某些指令處理後輸出,所以sed更適合於處理大數據文件。
.sed流程:
        * 通過文件或管道讀取文件內容。
        * sed並不直接修改源文件,而是將讀入的內容複製到緩衝區中,我們稱之爲模式空間(pattern space)。
        * 根據sed的指令對模式空間中的內容進行處理並輸出結果,默認輸出至標準輸出即屏幕上。
              輸入
        ------------------------------------------------
                      |
                      |
                      v
                      v
            讀取一行內容,並複製到模式空間    <------------ sed 指令
                      |
                      |
                      v
                      v
        ------------------------------------------------
                輸出經過處理後的內容
二、sed基本語法結構
sed  Options...  [script]   [inputfile...]
sed  選項...       [腳本指令]      [輸入文件]
如果沒有輸入文件,則sed默認對標準輸入進行處理(即鍵盤輸入)。腳本指令是第一個不以“-”開始的參數。
1.選項含義:
    --version            顯示sed版本。
    --help               顯示幫助文檔。
    -n,--quiet,--silent    靜默輸出,默認情況下,sed程序在所有的腳本指令執行完畢後,將自動打印模式空間中的內容,這些選項可以屏蔽自動打印。
    -e script              允許多個腳本指令被執行。
    -f script-file,
    --file=script-file        從文件中讀取腳本指令,對編寫自動腳本程序來說很棒!
    -i,--in-place        直接修改源文件,經過腳本指令處理後的內容將被輸出至源文件(源文件被修改)慎用!
     -l N, --line-length=N    該選項指定l指令可以輸出的行長度,l指令用於輸出非打印字符。
     --posix            禁用GNU sed擴展功能。
     -r, --regexp-extended   在腳本指令中使用擴展正則表達式
     -s, --separate        默認情況下,sed將把命令行指定的多個文件名作爲一個長的連續的輸入流。GNU sed則允許把他們當作單獨的文件, 這樣如正則表達式則不進行跨文件匹配。
     -u, --unbuffered      最低限度的緩存輸入與輸出。
//練習
//列出上海大盤2014-05-29日的數據
grep "2014-05-29" gpdata.txt

//列出上海大盤2014-05月份的數據 
grep "2014-05-*" gpdata.txt

//列出上海大盤2014-05月份的數據 統計有多少條
grep "2014-05-*" gpdata.txt | wc -l

列出2014-06月所有上漲的數據   
        1)打印第一行
        grep "2014-06-*" gpdata.txt | awk '{ if($7 > 0) print $1 }'

        2)打印第1行和第7行
        grep "2014-06-*" gpdata.txt | awk '{ if($7 > 0) print $1, "\t", $7 }'

        3)統計共有多少條
        grep "2014-06-*" gpdata.txt | awk '{ if($7 > 0) print $1, "\t", $7 }' |wc -l

        4)打印符合條件的整行數據 $0
        grep "2014-06-*" gpdata.txt | awk '{ if($7 > 0) print $0}'

     $0代表整個文本行;
 $1代表文本行中的第1個數據字段;
 $2代表文本行中的第2個數據字段;
 $n代表文本行中的第n個數據字段。

5 顯示上海大盤2014-02月上漲幅度最大的一天

//-k7指定第7列 sort默認從小到大
grep "2014-02-*" gpdata.txt | sort -n -k7

grep "2014-02-*" gpdata.txt | sort -n -k7|tail -1
grep "2014-02-*" gpdata.txt | sort -n -k7|tail -2
grep "2014-02-*" gpdata.txt | sort -n -k7|tail -3

//-r逆序
grep "2014-02-*" gpdata.txt | sort -n -k7 -r
grep "2014-02-*" gpdata.txt | sort -n -k7 -r | head -1
grep "2014-02-*" gpdata.txt | sort -n -k7 -r | head -2
grep "2014-02-*" gpdata.txt | sort -n -k7 -r | head -3

顯示上海大盤2014-02月份所有上漲數據的時間和上漲的幅度(%)
grep "2014-02-*" gpdata.txt | awk '{ if ($7 > 0) print $1,"\t\t\t\t" $7 }'

7 顯示上海大盤2014-02月份所有上漲數據的時間和上漲的幅度(%),第5-10條之間的數據
//sed -n表示只顯示匹配行   p表示打印
grep "2014-02-*" gpdata.txt | awk '{ if ($7 > 0) print $1,"\t\t" $7 }' | sed -n "5,10p"

sed命令的常用用法
    1、按照一個範圍(第幾行到第幾行),提取數據
    2、sed的主要用法是編輯功能,對提取的數據,進行修改、替換、刪除、插入等操作
        其中替換必須要會。。

8 列出上海大盤2014-02月份漲跌在1個點和2個點之間的數據    
    grep "2014-02-*" gpdata.txt | awk '{ if($7 > 0 && $7 < 2) print $1 }'
  //打印全年的
  grep "2014-*" gpdata.txt | awk '{ if($7 > 0 && $7 < 2) print $1,"\t\t", $7 }'

//在目錄中查找*.sh的文件,檢索*.sh文件中"case關鍵字出現的文件名和行號
    find -name "*.sh" | xargs grep -n "case"
//提取出行號
find -name "*.sh" | xargs grep -n "case" | awk -F":" '{ print $1, "\t\t", $2 }'

//sed 打印所有行 
sed -n 'p' 2.txt

//從第3行開始匹配,打印到含有ddd的行
sed -n '3,/ddd/p' 2.txt

//打印空行所在的行號  =表示顯示行號
sed -n  '/^$/=' 2.txt 
顯示hello所在的行
sed -n '/hello/=' 2.txt 

//將2.txt中的所有的d 替換爲 D     g表示所有
//原文件不會修改
sed 's/d/D/g' 2.txt 

//將win下的/r替換爲空,將結果重定向到new.txt中
sed -i 's/^M//g' 3.txt>new.txt


文本處理常用技巧總結
find命令:按照文件名,在某一目錄下,查找符合條件的目錄或者文件
    find -name "*.sh" ./

    grep命令 對文本模式匹配,按照行方式 
        -v 取反 -n顯示匹配行及行號 -c輸出匹配計數
    awk命令 對文本按照列進行處理或打印
    sort命令 對文本按照行進行排序處理,默認從小到大
    -n按照數字處理 -k7代表第7-r逆序
    sed命令 按照行或者處理文本
    sed -n '1p'     -n按照行定爲打印
    sed -n '1,3p'   範圍
    sed -n '$p'     代表最後一行
    sed 文本替換
    ipcs | sed -n '/shared/='
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章