linux文本處理-sed,sort,uniq,join,cut,paste,split

linux學習--sed,sort,uniq,join,cut,paste,split

==============================sed==========================

sed是一個非交互性性文本編輯器, 它編輯文件或標準輸入導出的文件拷貝。標準輸入可能是來自鍵盤、文件重定向、字符串或變量,或者是一個管道文件。sed可以隨意編輯小或大的文件,有許多 sed命令用來編輯、刪除,並允許做這項工作時不在現場。sed一次性處理所有改變,因而變得很有效,對用戶來說,最重要的是節省了時間sed必須通過行號和正則表達式指定要改變的文本行

sed怎樣讀取數據:
    sed從文件的一個文本行或從標準輸入的幾種格式中讀取數據,將之拷貝到一個編輯緩衝區,然後讀命令行或腳本的第一條命令,並使用這些命令查找模式或定位行號編輯它,重複過程直到命令結束

sed命令的調用:
    在命令行鍵入命令;將sed命令插入腳本文件,然後調用sed;將sed命令插入腳本文件,並使sed腳本可執行
    sed [option] sed命令 輸入文件            在命令行使用sed命令,實際命令要加單引號
    sed [option] -f sed腳本文件 輸入文件     使用sed腳本文件
    sed腳本文件 [option] 輸入文件            第一行具有sed命令解釋器的sed腳本文件
    option如下:
      n 不打印; sed不寫編輯行到標準輸出,缺省爲打印所有行(編輯和未編輯),p命令可以用來打印編輯行
       c 下一命令是編輯命令,使用多項編輯時加入此選項
      f 如果正在調用sed腳本文件,使用此選項,此選項通知sed一個腳本文件支持所用的sed命令,如
           sed -f myscript.sed input_file 這裏myscript.sed即爲支持sed命令的文件
    使用重定向文件即可保存sed的輸出

使用sed在文本中定位文本的方式:
    x        x爲一行號,比如1
    x,y     表示行號範圍從x到y,如2,5表示從第2行到第5行
    /pattern/    查詢包含模式的行,如/disk/或/[a-z]/
    /pattern/pattern/   查詢包含兩個模式的行,如/disk/disks/
    /pattern/,x   在給定行號上查詢包含模式的行,如/disk/,3
    x,/pattern/ 通過行號和模式查詢匹配行,如 3,/disk/
    x,y!     查詢不包含指定行號x和y的行

基本sed編輯命令:
    p      打印匹配行                      c\     用新文本替換定位文本
    =      顯示文件行號                     s     使用替換模式替換相應模式
    a\     在定位行號後附加新文本信息        r     從另一個文本中讀文本
    i\     在定位行號後插入新文本信息        w     寫文本到一個文件
    d      刪除定位行                      q     第一個模式匹配完成後退出或立即退出
    l      顯示與八進制ASCII代碼等價的控制字符        y 傳送字符
    n      從另一個文本中讀文本下一行,並附加在下一行   {}     在定位行執行的命令組
    g      將模式2粘貼到/pattern n/

基本sed編程舉例:
    使用p(rint)顯示行: sed -n '2p' temp.txt   只顯示第2行,使用選項n
    打印範圍:   sed -n '1,3p' temp.txt         打印第1行到第3行
    打印模式: sed -n '/movie/'p temp.txt     打印含movie的行
    使用模式和行號查詢: sed -n '3,/movie/'p temp.txt   只在第3行查找movie並打印
    顯示整個文件: sed -n '1,$'p temp.txt      $爲最後一行
    任意字符:   sed -n '/.*ing/'p temp.txt      注意是.*ing,而不是*ing
    打印行號: sed -e '/music/=' temp.txt
    附加文本:(創建sed腳本文件)chmod u+x script.sed,運行時./script.sed temp.txt
        #!/bin/sed -f
         /name1/ a\             #a\表示此處換行添加文本
        HERE ADD NEW LINE.     #添加的文本內容
    插入文本:
/name1/ a\ 改成 4 i\ 4表示行號,i插入
    修改文本: /name1/ a\ 改成 /name1/ c\ 將修改整行,c修改
    刪除文本: sed '1d' temp.txt   或者 sed '1,4d' temp.txt
    替換文本: sed 's/source/OKSTR/' temp.txt     將source替換成OKSTR
             sed 's/\$//g' temp.txt              將文本中所有的$符號全部刪除
             sed 's/source/OKSTR/w temp2.txt' temp.txt 將替換後的記錄寫入文件temp2.txt
    替換修改字符串: sed 's/source/"ADD BEFORE" &/p' temp.txt
              結果將在source字符串前面加上"ADD BEFORE",這裏的&表示找到的source字符並保存
    sed結果寫入到文件: sed '1,2 w temp2.txt' temp.txt
                     sed '/name/ w temp2.txt' temp.txt
    從文件中讀文本: sed '/name/r temp2.txt' temp.txt
    在每列最後加文本: sed 's/[0-9]*/& Pass/g' temp.txt
    從shell向sed傳值: echo $NAME | sed "s/go/$REP/g"   注意需要使用雙引號

快速一行命令:
    's/\.$//g'          刪除以句點結尾行
    '-e /abcd/d'       刪除包含abcd的行
    's/[][][]*/[]/g'   刪除一個以上空格,用一個空格代替
    's/^[][]*//g'      刪除行首空格
    's/\.[][]*/[]/g'   刪除句號後跟兩個或更多的空格,用一個空格代替
    '/^$/d'            刪除空行
    's/^.//g'          刪除第一個字符,區別 's/\.//g'刪除所有的句點
    's/COL/(...\)//g' 刪除緊跟COL的後三個字母
    's/^\///g'         刪除路徑中第一個\

          's/^[0-9]//g'                       去除行首數字

================================合併與分割==========================
sort uniq join cut paste split
================sort用法=====================
sort命令將許多不同的域按不同的列順序分類。
1、sort選項
sort命令的一般格式爲:
sort -cmu -o output_file [other options] +pos1 +pos2 input_files
下面簡要介紹一下s o r t的參數:
-c 測試文件是否已經分類。
-m 合併兩個分類文件。
-u 刪除所有複製行。
-o 存儲s o r t結果的輸出文件名。
其他選項有:
-b 使用域進行分類時,忽略第一個空格。
-n 指定分類是域上的數字分類。
-t 域分隔符;用非空格或t a b鍵分隔域。
-r 對分類次序或比較求逆。
+n n爲域號。使用此域號開始分類。
n n爲域號。在分類比較時忽略此域,一般與+ n一起使用。
post1 傳遞到m,n。m爲域號,n爲開始分類字符數;例如4,6意即以第5域分類,從第7個字符開始。
2、sort啓動方式
缺省情況下, s o r t認爲一個空格或一系列空格爲分隔符。要加入其他方式分隔,使用- t選項。
sort執行時,先查看是否爲域分隔設置了- t選項,如果設置了,則使用它來將記錄分隔成域0、域1等等;
如果未設置,用空格代替。缺省時s o r t將整個行排序,指定域號的情況例外。
關於s o r t的一個重要事實是它參照第一個域作爲域0,域1是第二個域,等等。
3、文件是否已分類
sort -c data.txt
4、sort分類求逆
如果要逆向s o r t結果,使用-r選項。
   sort -t: -r video.txt
5、按指定域分類
有時需要只按第2域(分類鍵1)分類。
sort -t: +1 video.txt
6、數值域分類
用-n選項。必須用,不然得不到想要的結果。
sort -t: +3n video.txt
7、唯一性分類
使用- u選項進行唯一性(不重複)分類以去除重複行。
8、使用k的其他sort方法
sort還有另外一些方法指定分類鍵。可以指定k選項。
sort -t: -k4 video.txt

使用k做分類鍵排序:
可以指定分類鍵次序。先以第4域,再以第1域分類,命令爲-k4 -k1
sort -t: -k4 -k1 video.txt
9、指定sort序列
可以指定分類鍵順序,也可以使用- n選項指定不使用哪個分類鍵進行查詢。看下面的sort命令:
sort +0 -2 +3
該命令意即開始以域0分類,忽略域2,然後再使用域3分類。
10、pos用法
指定開始分類的域位置的另一種方法是使用如下格式:
sort +filed.characterin
意即從filed開始分類,但是要在此域的第characterin個字符開始。
11、使用head和tail將輸出分類
可以使用h e a d或t a i l查閱任何大的文本文件
head -200 filename
12、awk使用sort輸出結果
13、將兩個分類文件合併
將文件合併前,它們必須已被分類.
使用-m +0。將這個文件併入已存在的分類文件v i d e o . s o r t,要以名稱域進行分類,實際上沒有必要加入+ o,但爲了保險起見,還是加上的好。
   sort -t: -m +0 video2.txt video.sort
  
   ===================uniq用法====================
uniq用來從一個文本文件中去除或禁止重複行。一般u n i q假定文件已分類,並且結果正確。
sort的唯一性選項去除所有重複行,而uniq命令並不這樣做。重複行是什麼?在uniq裏意即持續不斷重複出現的行,中間不夾雜任何其他文本.
命令一般格式:
   uniq -u d c -f inputfile outputfile
其選項含義:
   -u 只顯示不重複行。
   -d 只顯示有重複數據行,每種重複行只顯示其中一行
   -c 打印每一重複行出現次數。
   -f n爲數字,前n個域被忽略。
   一些系統不識別- f選項,這時替代使用- n。
對特定域進行測試:
使用- n只測試一行一部分的唯一性。例如- 5意即測試第5域後各域唯一性。域從1開始記數。
如果忽略第1域,只測試第2域唯一性,使用- n 2,下述文件包含一組數據,其中第2域代表組代碼。
   uniq -f2 parts.txt或
   uniq -n2 parts.txt
==================join用法(強大呀,像sql裏面的join 呢)========================
join用來將來自兩個分類文本文件的行連在一起。
下面講述join工作方式。這裏有兩個文件f i l e 1和f i l e 2,當然已經分類。每個文件裏都有一
些元素與另一個文件相關。由於這種關係, join將兩個文件連在一起,這有點像修改一個主文
件,使之包含兩個文件裏的共同元素。
爲有效使用join,需分別將輸入文件分類:
join的格式:
join [option] file1,file2
an n 爲一數字,用於連接時從文件n中顯示不匹配行。例如, -a1顯示第一個文件的不匹
配行,- a2爲從第二個文件中顯示不匹配行。
o n.m n爲文件號,m爲域號。1.3表示只顯示文件1第三域,每個n,m必須用逗號分隔,
如1.3,2.1。
j n m   n爲文件號,m爲域號。使用其他域做連接域
t 域分隔符。用來設置非空格或t a b鍵的域分隔符。例如,指定冒號做域分隔符- t:

連接域爲域0,缺省join刪除或去除連接鍵的第二次重複出現:
   join names.txt town.txt
1、不匹配連接,下面的例子顯示匹配及不匹配域
   join -a1 -a2 names.txt town.txt
只顯示第一個文件中不匹配行:
   join -a1 names.txt town.txt
2、選擇性連接
使用- o選項選擇連接域。例如要創建一個文件僅包含人名及城鎮, j o i n執行時需要指定顯示域。方式如下:
使用1 . 1顯示第一個文件第一個域,2 . 2顯示第二個文件第二個域,其間用逗號分隔。命令爲:
   join -o 1.1,2.2 names.txt town.txt
使用-jn m進行其他域連接,例如用文件1域3和文件2域2做連接鍵,命令爲:
   join -j1 3 -j2 2 names.txt town.txt

===========================cut用法=========================================
cut用來從標準輸入或文本文件中剪切列或域。剪切文本可以將之粘貼到一個文本文件。
cut一般格式爲:
cut [options] file1 file2
下面介紹其可用選項:
-c list 指定剪切字符數。
-f field 指定剪切域數。
-d 指定與空格和t a b鍵不同的域分隔符。
-c 用來指定剪切範圍,如下所示:
-c 1,5-7 剪切第1個字符,然後是第5到第7個字符。
-c1-50 剪切前5 0個字符。
-f 格式與- c相同。
-f 1,5 剪切第1域,第5域。
- f 1,10-12 剪切第1域,第1 0域到第1 2域。

剪切指定域:
cut命令中剪切各域需用逗號分隔,如剪切域1和3,可以使用:
cut -d: -f1,3 pers

=========================paste用法==========================================
cut用來從文本文件或標準輸出中抽取數據列或者域,然後再用paste可以將這些數據粘貼
起來形成相關文件。粘貼兩個不同來源的數據時,首先需將其分類,並確保兩個文件行數相同。
paste將按行將不同文件行信息放在一行。缺省情況下,paste連接時,用空格或t a b鍵分隔
新行中不同文本,除非指定- d選項,它將成爲域分隔符。
paste格式爲;
   paste -d -s -file1 file2
選項含義如下:
-d 指定不同於空格或t a b鍵的域分隔符。例如用@分隔域,使用- d @。
-s 將每個文件合併成行而不是按行粘

paste命令管道輸入:
paste命令還有一個很有用的選項( -)。意即對每一個( -),從標準輸入中讀一次數據。
使用空格作域分隔符,以一個4列格式顯示目錄列表。方法如下:
   ls |paste -d":" - - - -
=========================split用法==========================================
split用來將大文件分割成小文件。

split -output_file-size input-filename output-filename
每個文件格式爲x [ a a ]到x [ z z ],x爲文件名首字母, [ a a ]、[ z z ]爲文件名剩餘部分順序字符組合.
   split -5000 url_access_user.txt splitfile

-------------

 

6. 實例
刪除:d命令
*
$ sed '2d' example-----刪除example文件的第二行。
*
$ sed '2,$d' example-----刪除example文件的第二行到末尾所有行。
*
$ sed '$d' example-----刪除example文件的最後一行。
*
$ sed '/test/'d example-----刪除example文件所有包含test的行。
替換:s命令
*
$ sed 's/test/mytest/g' example-----在整行範圍內把test替換爲mytest。如果沒有g標記,則只有每行第一個匹配的test被替換成mytest。
*
$ sed -n 's/^test/mytest/p' example-----(-n)選項和p標誌一起使用表示只打印那些發生替換的行。也就是說,如果某一行開頭的test被替換成mytest,就打印它。
*
$ sed 's/^192.168.0.1/&localhost/' example-----&符號表示替換換字符串中被找到的部份。所有以192.168.0.1開頭的行都會被替換成它自已加 localhost,變成192.168.0.1localhost。
*
$ sed -n 's/\(love\)able/\1rs/p' example-----love被標記爲1,所有loveable會被替換成lovers,而且替換的行會被打印出來。
*
$ sed 's#10#100#g' example-----不論什麼字符,緊跟着s命令的都被認爲是新的分隔符,所以,“#”在這裏是分隔符,代替了默認的“/”分隔符。表示把所有10替換成100。
選定行的範圍:逗號
*
$ sed -n '/test/,/check/p' example-----所有在模板test和check所確定的範圍內的行都被打印。
*
$ sed -n '5,/^test/p' example-----打印從第五行開始到第一個包含以test開始的行之間的所有行。
*
$ sed '/test/,/check/s/$/sed test/' example-----對於模板test和west之間的行,每行的末尾用字符串sed test替換。
多點編輯:e命令
*
$ sed -e '1,5d' -e 's/test/check/' example-----(-e)選項允許在同一行裏執行多條命令。如例子所示,第一條命令刪除1至5行,第二條命令用check替換test。命令的執行順序對結果有影響。如果兩個命令都是替換命令,那麼第一個替換命令將影響第二個替換命令的結果。
*
$ sed --expression='s/test/check/' --expression='/love/d' example-----一個比-e更好的命令是--expression。它能給sed表達式賦值。
從文件讀入:r命令
*
$ sed '/test/r file' example-----file裏的內容被讀進來,顯示在與test匹配的行後面,如果匹配多行,則file的內容將顯示在所有匹配行的下面。
寫入文件:w命令
*
$ sed -n '/test/w file' example-----在example中所有包含test的行都被寫入file裏。
追加命令:a命令
*
$ sed '/^test/a\\--->this is a example' example<-----'this is a example'被追加到以test開頭的行後面,sed要求命令a後面有一個反斜槓。
插入:i命令
$ sed '/test/i\\
new line
-------------------------' example
如果test被匹配,則把反斜槓後面的文本插入到匹配行的前面。
下一個:n命令
*
$ sed '/test/{ n; s/aa/bb/; }' example-----如果test被匹配,則移動到匹配行的下一行,替換這一行的aa,變爲bb,並打印該行,然後繼續。
變形:y命令
*
$ sed '1,10y/abcde/ABCDE/' example-----把1--10行內所有abcde轉變爲大寫,注意,正則表達式元字符不能使用這個命令。
退出:q命令
*
$ sed '10q' example-----打印完第10行後,退出sed。
保持和獲取:h命令和G命令
*
$ sed -e '/test/h' -e '$G example-----在sed處理文件的時候,每一行都被保存在一個叫模式空間的臨時緩衝區中,除非行被刪除或者輸出被取消,否則所有被處理的行都將打印在屏幕上。接着模式空間被清空,並存入新的一行等待處理。在這個例子裏,匹配test的行被找到後,將存入模式空間,h命令將其複製並存入一個稱爲保持緩存區的特殊緩衝區內。第二條語句的意思是,當到達最後一行後,G命令取出保持緩衝區的行,然後把它放回模式空間中,且追加到現在已經存在於模式空間中的行的末尾。在這個例子中就是追加到最後一行。簡單來說,任何包含test的行都被複制並追加到該文件的末尾。
保持和互換:h命令和x命令
*
$ sed -e '/test/h' -e '/check/x' example -----互換模式空間和保持緩衝區的內容。也就是把包含test與check的行互換。
7. 腳本
Sed腳本是一個sed的命令清單,啓動Sed時以-f選項引導腳本文件名。Sed對於腳本中輸入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多個命令,要用分號分隔。以#開頭的行爲註釋行,且不能跨行



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章