1、sed使用手冊(轉(zhuǎn)載)
sed使用手冊(轉(zhuǎn)載) 發(fā)信站: BBS 水木清華站 (Wed Sep 25 21:06:36 2002), 站內(nèi)信件 Sed 命令列可分成編輯指令與文件檔部份。其中 , 編輯指令負責(zé)控制所有的編 輯工作 ; 文件檔表示所處理的檔案。 sed 的編輯指令均由位址(address)與函數(shù)(function)兩部份組成 , 其中 , 在 執(zhí)行時 , sed 利用它的位址參數(shù)來 決定編輯的對象;而用它的函數(shù)參數(shù)(解[3])編輯。 此外 , sed 編輯指令 , 除了可在命令列上執(zhí)行 , 也可在檔案內(nèi)執(zhí)行。其中差 別只是在命令列上執(zhí)行時 , 其前必 須加上選項 -e ; 而在檔案(解[4])內(nèi)時 , 則只需在其檔名前加上選項 -f。另 外 , sed 執(zhí)行編輯指令是依照它 們在命令列上或檔內(nèi)的次序。 下面各節(jié) , 將介紹執(zhí)行命令列上的編輯指令 、sed 編輯指令、執(zhí)行檔案內(nèi)的編 輯指令、執(zhí)行多個檔案的編輯、及 執(zhí)行 sed 輸出控制。 2.1 執(zhí)行命令列上的編輯指令 2.2 sed 編輯指令 2.3 執(zhí)行檔案內(nèi)的編輯指令 2.4 執(zhí)行多個檔案的編輯 2.5 執(zhí)行 sed 輸出控制 2.1.執(zhí)行命令列上的編輯指令 當(dāng)編輯指令(參照[section 2.2])在命令列上執(zhí)行時 , 其前必須加上選項 -e 。 其命令格式如下 : sed -e '編輯指令1' -e '編輯指令2' ... 文件檔 其中 , 所有編輯指令都緊接在選項 -e 之後 , 并置於兩個 " ' " 特殊字元間。 另外 , 命令上編輯指令的執(zhí)行是由 左而右。 一般編輯指令不多時 , 使用者通常直接在命令上執(zhí)行它們。例如 , 刪除 yel. dat 內(nèi) 1 至 10 行資料 , 并將其 馀文字中的 "yellow" 字串改成 "black" 字串。此時 , 可將編輯指令直接在命 令上執(zhí)行 , 其命令如下 : sed -e '1,10d' -e 's/yellow/black/g' yel.dat 在命令中 , 編輯指令 '1,10d'(解[5])執(zhí)行刪除 1 至 10 行資料 ; 編輯指令 's/yellow/black/g'(解[6]) , "yellow" 字串替換(substuite)成 "black" 字串。 2.2 sed 的編輯指令 sed 編輯指令的格式如下 : [address1[,address2]]function[argument] 其中 , 位址參數(shù) address1 、address2 為行數(shù)或 regular expression 字串 , 表示所執(zhí)行編輯的資料行 ; 函數(shù)參 數(shù) function[argument] 為 sed 的內(nèi)定函數(shù) , 表示執(zhí)行的編輯動作。 下面兩小節(jié) , 將仔細介紹位址參數(shù)的表示法與有哪些函數(shù)參數(shù)供選擇。 2.2.1 位址(address)參數(shù)的表示法 實際上 , 位址參數(shù)表示法只是將要編輯的資料行 , 用它們的行數(shù)或其中的字串 來代替表示它們。下面舉幾個例子 說明(指令都以函數(shù)參數(shù) d(參照[section4.2]) 為例) : 刪除檔內(nèi)第 10 行資料 , 則指令為 10d。 刪除含有 "man" 字串的資料行時 , 則指令為 /man/d。 刪除檔內(nèi)第 10 行到第 200 行資料, 則指令為 10,200d。 刪除檔內(nèi)第 10 行到含 "man" 字串的資料行 , 則指令為 10,/man/d。 接下來 , 以位址參數(shù)的內(nèi)容與其個數(shù)兩點 , 完整說明指令中位址參數(shù)的表示法 (同樣也以函數(shù)參數(shù) d 為例)。 位址參數(shù)的內(nèi)容: 位址為十進位數(shù)字 : 此數(shù)字表示行數(shù)。當(dāng)指令執(zhí)行時 , 將對符合此行數(shù)的資料執(zhí) 行函數(shù)參數(shù)指示的編輯動作。例如 , 刪除資料檔中的第 15 行資料 , 則指令為 15d(參照[section4.2])。其馀類推 , 如刪除資料檔中的第 m 行資料 , 則 指令為 md 。 位址為 regular expression(參照[附錄 A]): 當(dāng)資料行中有符合 regular expression 所表示的字串時 , 則執(zhí)行函數(shù)參數(shù)指示 的編輯動作。另外 , 在 regular expression 前後必須加上 "/"。例如指令為 /t.*t/d , 表示刪除所有含 兩 "t" 字母的資料行。其中 , "." 表示任意字元; "*" 表示其前字元可重任意次 , 它們結(jié)合 ".*" 表示兩 "t" 字母 間的任意字串。 位址參數(shù)的個數(shù) : 在指令中 , 當(dāng)沒有位址參數(shù)時 , 表示全部資料行執(zhí)行函數(shù)參 數(shù)所指示的編輯動作; 當(dāng)只有一位址 參數(shù)時 , 表示只有符合位址的資料行才編輯 ; 當(dāng)有兩個位址參數(shù) , 如 address1,address2 時 , 表示對資料區(qū)執(zhí)行 編輯 , address1 代表起始資料行 , address2 代表結(jié)束資料行。對於上述內(nèi)容 , 以下面例子做具說明。 例如指令為 d 其表示刪除檔內(nèi)所有資料行。 例如指令為 5d 其表示刪除檔內(nèi)第五行資料。 例如指令為 1,/apple/d 其表示刪除資料區(qū) , 由檔內(nèi)第一行至內(nèi)有 "apple" 字串的資料行。 例如指令為 /apple/,/orange/d 其表示刪除資料區(qū) , 由檔內(nèi)含有 "apple" 字串至含有 "orange" 字串的資料行 2.2.2 有那些函數(shù)(function)參數(shù) 下頁表中介紹所有 sed 的函數(shù)參數(shù)(參照[chapter 4])的功能。 函數(shù)參數(shù) 功能 ∶ label 建立 script file 內(nèi)指令互相參考的位置。 # 建立解 { } 集合有相同位址參數(shù)的指令。 ! 不執(zhí)行函數(shù)參數(shù)。 = 印出資料行數(shù)( line number )。 a 添加使用者輸入的資料。 b label 將執(zhí)行的指令跳至由 : 建立的參考位置。 c 以使用者輸入的資料取代資料。 d 刪除資料。 D 刪除 pattern space 內(nèi)第一個 newline 字母 前的資料。 g 拷貝資料從 hold space。 G 添加資料從 hold space 至 pattern space 。 h 拷貝資料從 pattern space 至 hold space 。 H 添加資料從 pattern space 至 hold space 。 l 印出 l 資料中的 nonprinting character 用 ASCII 碼。 i 插入添加使用者輸入的資料行。 n 讀入下一筆資料。 N 添加下一筆資料到 pattern space。 p 印出資料。 P 印出 pattern space 內(nèi)第一個 newline 字母 前的資料。 q 跳出 sed 編輯。 r 讀入它檔內(nèi)容。 s 替換字串。 t label 先執(zhí)行一替換的編輯指令 , 如果替換成牛p>則將編輯指令跳至 : label 處執(zhí)行。 w 寫資料到它檔內(nèi)。 x 交換 hold space 與 pattern space 內(nèi)容。 y 轉(zhuǎn)換(transform)字元。 雖然 , sed 只有上表所述幾個擁有基本編輯功能的函數(shù) , 但由指令中位址參數(shù)和 指令與指令間的配合 , 也能使 sed 完成大部份的編輯任務(wù)。 2.3 執(zhí)行檔案內(nèi)的編輯指令 當(dāng)執(zhí)行的指令太多 , 在命令列上撰寫起來十分混亂 , 此時 , 可將這些指令整 理儲存在檔案 (譬如檔名為 script_file )內(nèi) , 用選項 -f script_file , 則讓 sed 執(zhí)行 script_file 內(nèi)的編輯指令。其命 令的格示如下 : sed -f script_file 文件檔 其中 , 執(zhí)行 script_file 內(nèi)編輯指令的順序是由上而下。例如上一節(jié)的例子 , 其可改成如下命令: sed -f ysb.scr yel.dat 其中 , ysb.scr 檔的內(nèi)容如下 : 1,10d s/yellow/black/g 另外 , 在命令列上可混合使用選項 -e 與 -f , sed 執(zhí)行指令順序依然是由命 令列的左到右, 如執(zhí)行至 -f 後 檔案內(nèi)的指令 , 則由上而下執(zhí)行。 2.4 執(zhí)行多個文件檔的編輯 在 sed 命令列上 , 一次可執(zhí)行編輯多個文件檔 , 它們跟在編輯指令之後。例 如 , 替換 white.dat、red.dat、black.dat 檔內(nèi)的 "yellow" 字串成 "blue" , 其命令 如下: sed -e 's/yellow/blue/g' white.dat red.dat black.dat 上述命令執(zhí)行時 , sed 依 white.dat、red.dat、black.dat 順序 , 執(zhí)行編輯指 令 s/yellow/blue/(請參照[section 4.1] , 進行字串的替換。 2.5.執(zhí)行輸出的控制 在命令列上的選項 -n (解[7]) 表示輸出由編輯指令控制。由前章內(nèi)容得知 , sed 會 "自動的" 將資料由 pattern space 輸送到標(biāo)準(zhǔn)輸出檔。但藉著選項 -n , 可將 sed 這 "自動的 " 的動作改成 "被動的" 由它所執(zhí)行的 編輯指令(解[8])來決定結(jié)果是否輸出。 由上述可知 , 選項 -n 必須與編輯指令一起配合 , 否則無法獲得結(jié)果。例如 , 印出 white.dat 檔內(nèi)含有 "white" 字串的資料行 , 其命令如下: sed -n -e '/white/p' white.dat 上面命令中 , 選項 -n 與編輯指令 /white/p (參照[section4.6]) 一起配合控制 輸出。其中 , 選項 -n 將輸出控制權(quán) 移給編輯指令;/white/p 將資料行中含有 "white" 字串印出螢?zāi)弧?nbsp;
=====================================================
1.sed -n '2'p filename 打印文件的第二行。
2.sed -n '1,3'p filename 打印文件的1到3行
3. sed -n '/Neave/'p filename 打印匹配Neave的行(模糊匹配)
4. sed -n '4,/The/'p filename 在第4行查詢模式The
5. sed -n '1,$'p filename 打印整個文件,$表示最后一行。
6. sed -n '/.*ing/'p filename 匹配任意字母,并以ing結(jié)尾的單詞(點號不能少)
7 sed -n / -e '/music/'= filename 打印匹配行的行號,-e 會打印文件的內(nèi)容,同時在匹配行的前面標(biāo)志行號。-n只打印出實際的行號。
8.sed -n -e '/music/'p -e '/music/'= filename 打印匹配的行和行號,行號在內(nèi)容的下面
9.sed '/company/' a "Then suddenly it happend" filename 選擇含有company的行,將后面的內(nèi)容"Then suddenly it happend"加入下一行。注意:它并不改變文件,所有
操作在緩沖區(qū),如果要保存輸出,重定向到一個文件。
10. sed '/company/' i "Then suddenly it happend" filename 同9,只是在匹配的行前插入
11.sed '/company/' c "Then suddenly it happend" filename 用"Then suddenly it happend"替換匹配company的行的內(nèi)容。
12.sed '1'd ( '1,3'd '$'d '/Neave/'d) filename 刪除第一行(1到3行,最后一行,匹配Neave的行)
13.[ address [,address]] s/ pattern-to-find /replacement-pattern/[g p w n] s選項通知s e d這是一個替換操作,并查詢pattern-to-find,成功后用replacement-pattern替換它。 替換選項如下: g 缺省情況下只替換第一次出現(xiàn)模式,使用g選項替換全局所有出現(xiàn)模式。 p 缺省s e d將所有被替換行寫入標(biāo)準(zhǔn)輸出,加p選項將使- n選項無效。- n選項不打印輸出結(jié)果。 w 文件名使用此選項將輸出定向到一個文件。(注意只將匹配替換的行寫入文件,而不是整個內(nèi)容)
14.sed s'/nurse/"hello "&/' filename 將'hello '增加到'nurse' 的前面。
15. sed '/company/r append.txt' filename 在匹配company的行的下一行開始加入文件append.txt的內(nèi)容。
16. sed '/company/'q filename 首次匹配company后就退出sed程序
==============================
sed 's/abc/123/g' myfile
sed -n 's/^west/north/p' myfile 打印替換了west開頭用north替換的行
sed -n '/aa/,/bb/p' myfile 打印在包含以aa開頭到以bb結(jié)束的行
sed '1,4s/aa/bb/g' myfile
sed '4,/aa/s/11/22/g' myfile 在第4行后到包含aa結(jié)束的行中,替換11為22
sed 'aa/,/bb/s/11/22/g' myfile 在包含以aa開頭到以bb結(jié)束的行中,替換11為22
sed '1,5s/$/cc/' myfile 每行的末尾以cc來替換
--e----------------------- sed -e '1,3d' -e 's/aa/bb/' myfile 對myfile同時執(zhí)行d 與s 操作
--w----------------------- sed -n '/north/w newfile' myfile 把myfile中包含north的行寫入newfile中
--a----------------------- sed '/^north /a \ ----->add string------------------' myfile 往myfiel追加行
--i----------------------- sed '/aa/i\ new line1-------------- ------------new line2--------------' myfile
在包含/aa的行下插入行
--n-------------------- sed /aa/{n;s/11/22/;} myfile 找到包含aa的行后,對下一行執(zhí)行s操作
--y--------------------
sed 1,3y/abcdefg/ABCDEFG' myfile 在1,3行中把abcdefg變形為ABCDEFG
--q--------------------- sed '5q' myfile 推出命令。執(zhí)行到5行后退出
--h 與 g,x-------------- sed -e '/aa/h' -e '$g' myfile 把包含aa的行放如緩沖區(qū),在最后一行中增加(也就是把包含有aa的行追加到最后一行中)
sed -e '/aa/{h;d; }' -e '/bb/{g;}' myfile 把包含aa的行放入緩沖區(qū),刪除包含aa的行;找到bb的行后,把aa的行在后面追加
sed -e '/aa/h' -e '$g' myfile
sed -e '/aa/h' -e '/bb/x' myfile 把包含aa的行放入緩沖區(qū),當(dāng)出現(xiàn)/bb的行時,則把bb的內(nèi)容換為緩沖區(qū)的內(nèi)容
為了使用上述輸出信息做進一步自動處理,需要知道所存數(shù)據(jù)庫名稱,為此需執(zhí)行以下操作: 1) 使用s / - * / / g刪除橫線- - - - - -。 2) 使用/ ^ $ / d刪除空行。 3) 使用$ d刪除最后一行 4) 使用1 d刪除第一行。 5) 使用awk {print $1}打印第一列。 命令如下,這里使用了c a t,并管道傳送結(jié)果到s e d命令 最后的命令如下: cat sql.txt| sed 's/-*//g'|sed '/^$//g'|sed '$d'|sed '1d'|awk '{print $1}' 去除行首數(shù)字: sed 's/^[0-9]//g' data.txt 10、一些常用的處理 ‘s / \ . $ / / g’ 刪除以句點結(jié)尾行 ‘-e /abcd/d’ 刪除包含a b c d的行 ‘s / [ ] [ ] [ ] * / [ ] / g’ 刪除一個以上空格,用一個空格代替 ‘s / ^ [ ] [ ] * / / g’ 刪除行首空格 ‘s / \ . [ ] [ ] * / [ ] / g’ 刪除句點后跟兩個或更多空格,代之以一個空格 ‘/ ^ $ / d’ 刪除空行 ‘s / ^ . / / g’ 刪除第一個字符 ‘s /CO L \ ( . . . \ ) / / g’ 刪除緊跟C O L的后三個字母 ‘s / ^ \ / / / g’ 從路徑中刪除第一個\ ‘s / [ ] / [ ] / / g’ 刪除所有空格并用t a b鍵替代 ‘S / ^ [ ] / / g’ 刪除行首所有t a b鍵 ‘s / [ ] * / / g’ 刪除所有t a b鍵
2、關(guān)于tr 通過使用 tr,您可以非常容易地實現(xiàn) sed 的許多最基本功能。您可以將 tr 看作為 sed 的(極其)簡化的變體:它可以用一個字符來替換另一個字符,或者可以完全除去一些字符。您也可以用它來除去重復(fù)字符。這就是所有 tr 所能夠做的。 tr用來從標(biāo)準(zhǔn)輸入中通過替換或刪除操作進行字符轉(zhuǎn)換。tr主要用于刪除文件中控制字符或進行字符轉(zhuǎn)換。使用tr時要轉(zhuǎn)換兩個字符串:字符串1用于查詢,字符串2用于處理各種轉(zhuǎn)換。tr剛執(zhí)行時,字符串1中的字符被映射到字符串2中的字符,然后轉(zhuǎn)換操作開始。 帶有最常用選項的tr命令格式為: tr -c -d -s ["string1_to_translate_from"] ["string2_to_translate_to"] < input-file 這里: -c 用字符串1中字符集的補集替換此字符集,要求字符集為ASCII。 -d 刪除字符串1中所有輸入字符。 -s 刪除所有重復(fù)出現(xiàn)字符序列,只保留第一個;即將重復(fù)出現(xiàn)字符串壓縮為一個字符串。 input-file是轉(zhuǎn)換文件名。雖然可以使用其他格式輸入,但這種格式最常用。 2、字符范圍 指定字符串1或字符串2的內(nèi)容時,只能使用單字符或字符串范圍或列表。 [a-z] a-z內(nèi)的字符組成的字符串。 [A-Z] A-Z內(nèi)的字符組成的字符串。 [0-9] 數(shù)字串。 \octal 一個三位的八進制數(shù),對應(yīng)有效的ASCII字符。 [O*n] 表示字符O重復(fù)出現(xiàn)指定次數(shù)n。因此[O*2]匹配OO的字符串。 tr中特定控制字符的不同表達方式 速記符含義八進制方式 \a Ctrl-G 鈴聲\007 \b Ctrl-H 退格符\010 \f Ctrl-L 走行換頁\014 \n Ctrl-J 新行\(zhòng)012 \r Ctrl-M 回車\015 \t Ctrl-I tab鍵\011 \v Ctrl-X \030 3、應(yīng)用例子 (1)去除oops.txt里面的重復(fù)的小寫字符 tr -s "[a-z]"<oops.txt >result.txt (2)刪除空行 tr -s "[\012]" < plan.txt 或 tr -s ["\n"] < plan.txt (3)有時需要刪除文件中的^M,并代之以換行 tr -s "[\015]" "[\n]" < file 或 tr -s "[\r]" "[\n]" < file (4)大寫到小寫 cat a.txt |tr "[a-z]" "[A-Z]" >b.txt (5)刪除指定字符 一個星期的日程表。任務(wù)是從其中刪除所有數(shù)字,只保留日期。日期有大寫,也有小寫格式。因此需指定兩個字符范圍[a-z]和[A-Z],命令tr -cs "[a-z][A-Z]" "[\012*]" 將文件每行所有不包含在[a-z]或[A-Z](所有希臘字母)的字符串放在字符串1中并轉(zhuǎn)換為一新行。-s選項表明壓縮所有新行, -c表明保留所有字母不動。原文件如下,后跟tr命令: tr -cs "[a-z][A-Z]" "[\012*]" <diary.txt (6)轉(zhuǎn)換控制字符 tr的第一個功能就是轉(zhuǎn)換控制字符,特別是從dos向UNIX下載文件時,忘記設(shè)置ftp關(guān)于回車換行轉(zhuǎn)換的選項時更是如此。cat -v filename 顯示控制字符。 cat -v stat.txt box aa^^^^^12^M apple bbas^^^^23^M ^Z 猜想‘^ ^ ^ ^ ^ ^’是tab鍵。每一行以Ctrl-M結(jié)尾,文件結(jié)尾Ctrl-Z,以下是改動方法。 使用-s選項,查看ASCII表。^的八進制代碼是136,^M是015,tab鍵是011,^Z是032 ,下面將按步驟完成最終功能。 用tab鍵替換^ ^ ^ ^ ^ ^,命令為"\136" "[\011*]"。將結(jié)果重定向到臨時工作文件stat.tmp tr -s "[\136]" "[\011*]" <stat.txt >stat.tmp 用新行替換每行末尾的^M,并用\n去除^Z,輸入要來自于臨時工作文件stat.tmp。 tr -s "[\015][\032]" "\n" <stat.tmp 要刪除所有的tab鍵,代之以空格,使用命令 tr -s "[\011]" "[\040*]" <input.file
(7)替換passwd文件中所有冒號,代之以tab鍵,可以增加可讀性 tr -s "[:]" "[\011]" < /etc/passwd 或 tr -s "[:]" "[\t]" < /etc/passwd (8)使路徑具有可讀性 如果用 echo $PATH 或者 echo $LD_LIBRARY_PATH 等類似的命令來顯示路徑信息的話,我們看到的將會是一大堆用冒號連接在一起的路徑, tr命令可以把這些冒號轉(zhuǎn)換為回車,這樣,這些路徑就具有很好的可讀性了 echo $PATH | tr ":" "\n" (9)可以在vi內(nèi)使用所有這些命令!只要記住:在tr命令前要加上您希望處理的行范圍和感嘆號 (!),如 1,$!tr -d '\t'(美元符號表示最后一行)。 (10)另外,當(dāng)有人給您發(fā)送了一個在 Mac OS 或 DOS/Windows 機器上創(chuàng)建的文本文件時,您會發(fā)現(xiàn)tr非常有用。 如果沒有將文件保存為使用 UNIX 換行符來表示行結(jié)束這種格式,則需要將這樣的文件轉(zhuǎn)換成本機 UNIX 格式,否則一些命令實用程序不會正確地處理這些文件。Mac OS 的行尾以回車字符(\r)結(jié)束,許多文本處理工具將這樣的文件作為一行來處理。為了糾正這個問題,可以用下列技巧: Mac -> UNIX:tr "\r" "\n"<macfile > unixfile UNIX -> Mac:tr "\n" "\r"<unixfile > macfile Microsoft DOS/Windows 約定,文本的每行以回車字符(\r)并后跟換行符(\n)結(jié)束。為了糾正這個問題,可以使用下列命令: DOS -> UNIX:tr -d "\r"<dosfile > unixfile UNIX -> DOS:在這種情況下,需要用awk,因為tr不能插入兩個字符來替換一個字符。要使用的 awk 命令為 awk '{ print $0"\r" }'<unixfile > dosfile 注:都可以用sed 來完成。
3、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的參數(shù): -c 測試文件是否已經(jīng)分類。 -m 合并兩個分類文件。 -u 刪除所有復(fù)制行。 -o 存儲s o r t結(jié)果的輸出文件名。 其他選項有: -b 使用域進行分類時,忽略第一個空格。 -n 指定分類是域上的數(shù)字分類。 -t 域分隔符;用非空格或t a b鍵分隔域。 -r 對分類次序或比較求逆。 +n n為域號。使用此域號開始分類。 n n為域號。在分類比較時忽略此域,一般與+ n一起使用。 post1 傳遞到m,n。m為域號,n為開始分類字符數(shù);例如4,6意即以第5域分類,從第7個字符開始。 2、sort啟動方式 缺省情況下, s o r t認為一個空格或一系列空格為分隔符。要加入其他方式分隔,使用- t選項。 sort執(zhí)行時,先查看是否為域分隔設(shè)置了- t選項,如果設(shè)置了,則使用它來將記錄分隔成域0、域1等等; 如果未設(shè)置,用空格代替。缺省時s o r t將整個行排序,指定域號的情況例外。 關(guān)于s o r t的一個重要事實是它參照第一個域作為域0,域1是第二個域,等等。 3、文件是否已分類 sort -c data.txt 4、sort分類求逆 如果要逆向s o r t結(jié)果,使用-r選項。 sort -t: -r video.txt 5、按指定域分類 有時需要只按第2域(分類鍵1)分類。 sort -t: +1 video.txt 6、數(shù)值域分類 用-n選項。必須用,不然得不到想要的結(jié)果。 sort -t: +3n video.txt 7、唯一性分類 使用- u選項進行唯一性(不重復(fù))分類以去除重復(fù)行。 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輸出結(jié)果 13、將兩個分類文件合并 將文件合并前,它們必須已被分類. 使用-m +0。將這個文件并入已存在的分類文件v i d e o . s o r t,要以名稱域進行分類,實際上沒有必要加入+ o,但為了保險起見,還是加上的好。 sort -t: -m +0 video2.txt video.sort ===================uniq用法==================== uniq用來從一個文本文件中去除或禁止重復(fù)行。一般u n i q假定文件已分類,并且結(jié)果正確。 sort的唯一性選項去除所有重復(fù)行,而uniq命令并不這樣做。重復(fù)行是什么?在uniq里意即持續(xù)不斷重復(fù)出現(xiàn)的行,中間不夾雜任何其他文本. 命令一般格式: uniq -u d c -f inputfile outputfile 其選項含義: -u 只顯示不重復(fù)行。 -d 只顯示有重復(fù)數(shù)據(jù)行,每種重復(fù)行只顯示其中一行 -c 打印每一重復(fù)行出現(xiàn)次數(shù)。 -f n為數(shù)字,前n個域被忽略。 一些系統(tǒng)不識別- f選項,這時替代使用- n。 對特定域進行測試: 使用- n只測試一行一部分的唯一性。例如- 5意即測試第5域后各域唯一性。域從1開始記數(shù)。 如果忽略第1域,只測試第2域唯一性,使用- n 2,下述文件包含一組數(shù)據(jù),其中第2域代表組代碼。 uniq -f2 parts.txt或 uniq -n2 parts.txt ==================join用法(強大呀,像sql里面的join 呢)======================== join用來將來自兩個分類文本文件的行連在一起。 下面講述join工作方式。這里有兩個文件f i l e 1和f i l e 2,當(dāng)然已經(jīng)分類。每個文件里都有一 些元素與另一個文件相關(guān)。由于這種關(guān)系, join將兩個文件連在一起,這有點像修改一個主文 件,使之包含兩個文件里的共同元素。 為有效使用join,需分別將輸入文件分類: join的格式: join [option] file1,file2 an n 為一數(shù)字,用于連接時從文件n中顯示不匹配行。例如, -a1顯示第一個文件的不匹 配行,- a2為從第二個文件中顯示不匹配行。 o n.m n為文件號,m為域號。1.3表示只顯示文件1第三域,每個n,m必須用逗號分隔, 如1.3,2.1。 j n m n為文件號,m為域號。使用其他域做連接域 t 域分隔符。用來設(shè)置非空格或t a b鍵的域分隔符。例如,指定冒號做域分隔符- t: 連接域為域0,缺省join刪除或去除連接鍵的第二次重復(fù)出現(xiàn): join names.txt town.txt 1、不匹配連接,下面的例子顯示匹配及不匹配域 join -a1 -a2 names.txt town.txt 只顯示第一個文件中不匹配行: join -a1 names.txt town.txt 2、選擇性連接 使用- o選項選擇連接域。例如要創(chuàng)建一個文件僅包含人名及城鎮(zhèn), j o i n執(zhí)行時需要指定顯示域。方式如下: 使用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用來從標(biāo)準(zhǔn)輸入或文本文件中剪切列或域。剪切文本可以將之粘貼到一個文本文件。 cut一般格式為: cut [options] file1 file2 下面介紹其可用選項: -c list 指定剪切字符數(shù)。 -f field 指定剪切域數(shù)。 -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用來從文本文件或標(biāo)準(zhǔn)輸出中抽取數(shù)據(jù)列或者域,然后再用paste可以將這些數(shù)據(jù)粘貼 起來形成相關(guān)文件。粘貼兩個不同來源的數(shù)據(jù)時,首先需將其分類,并確保兩個文件行數(shù)相同。 paste將按行將不同文件行信息放在一行。缺省情況下,paste連接時,用空格或t a b鍵分隔 新行中不同文本,除非指定- d選項,它將成為域分隔符。 paste格式為; paste -d -s -file1 file2 選項含義如下: -d 指定不同于空格或t a b鍵的域分隔符。例如用@分隔域,使用- d @。 -s 將每個文件合并成行而不是按行粘 paste命令管道輸入: paste命令還有一個很有用的選項( -)。意即對每一個( -),從標(biāo)準(zhǔn)輸入中讀一次數(shù)據(jù)。 使用空格作域分隔符,以一個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
UNIX下用awk對話單統(tǒng)計日消費額
=============================================================
1、用awk實現(xiàn)按照電話號碼進行統(tǒng)計
=============================================================
一般情況下,電話公司從交換機采集后將生成定長的話單文件,文件名也有一定的格式,如筆者正要處理的話單格式如下: [zengzc@ZCBILL bill_data]$ cat Ticket_20041210_11 87881141,10,10,120, 0,20041210092920 87881142,10,30,230,-10,20041210092920 87881143,10,30,100,-20,20041210092920 87881143,10,30,110, 10,20041210093825 87881143,10,40, 90, 0,20041210095005 87881146,10,15, 45, 0,20041210092525 87881130,10,15, 80, 0,20041210092525 87881131,10,45, 60, 0,20041210090306 87881132,10,45,300, 20,20041210100101 87881133,10,60, 45, 20,20041210100101 87881134,10,10, 55,-10,20041210101010 87881134,10,20, 55,-10,20041210102020 87881143,10,20, 60, 0,20041210110201 87881143,10,10, 20, 0,20041210111515 第1~8為電話號碼 第10~11為基本費 第13~14為長途費 第16~18為附加費 第20~22為優(yōu)惠費 第24~27為YYYYMMDDHH24MISS格式的日期。 如果我想要把每一個客戶的基本費+長途費+附加費+優(yōu)惠費進行匯總,然后得出日消費總額。當(dāng)然如果采用Oracle是非常容易的,先把數(shù)據(jù)用SQL LOADER導(dǎo)入到Oracle數(shù)據(jù)庫中,然后將幾個費用的字段按照電話號碼進行sum就OK了。當(dāng)然我要講的是采用AIX下的awk或者gawk(Linux下,GNU)進行統(tǒng)計,然后導(dǎo)入到Oracle數(shù)據(jù)庫中。我試驗過,一般情況下某一個本地網(wǎng)每日的話單都在千萬級或者億級的記錄數(shù),在處理速度上采用awk是有優(yōu)勢的。以下就簡單的進行介紹。 1)、先寫出如下的awk程序: [zengzc@ZCBILL bill_data]$ cat StatFee.sh #!/bin/gawk -f BEGIN \ { FS="," } { PhoneList[$1]=$1 AllFeesPerPhone=$2+$3+$4+$5 Fee[$1]+=AllFeesPerPhone }; END \ { for (Row in PhoneList) { print "Phone Number : "PhoneList[Row]" All Fees :"Fee[Row] } } 2)、chmod +x StatFee.sh 3)、執(zhí)行:./StatFee.sh Ticket_20041210_11 4)、搞定,得出如下數(shù)據(jù): Phone Number : 87881130 All Fees :105 Phone Number : 87881131 All Fees :115 Phone Number : 87881132 All Fees :375 Phone Number : 87881141 All Fees :140 Phone Number : 87881133 All Fees :135 Phone Number : 87881142 All Fees :260 Phone Number : 87881134 All Fees :140 Phone Number : 87881143 All Fees :550 Phone Number : 87881146 All Fees :70
=============================================================
2、用awk實現(xiàn)按照時段進行統(tǒng)計 炮制電話號碼的統(tǒng)計方法。
============================================================= 1)有如下數(shù)據(jù)(和第一部分是一樣的,只是我用awk先把數(shù)據(jù)進行切分,具體切分方法見后面的附): [zengzc@ZCBILL bill_data]$ cat Ticket_20041210_11_1 87881141,10,10,120, 0,20041210,09,2920 87881142,10,30,230,-10,20041210,09,2920 87881143,10,30,100,-20,20041210,09,2920 87881143,10,30,110, 10,20041210,09,3825 87881143,10,40, 90, 0,20041210,09,5005 87881146,10,15, 45, 0,20041210,09,2525 87881130,10,15, 80, 0,20041210,09,2525 87881131,10,45, 60, 0,20041210,09,0306 87881132,10,45,300, 20,20041210,10,0101 87881133,10,60, 45, 20,20041210,10,0101 87881134,10,10, 55,-10,20041210,10,1010 87881134,10,20, 55,-10,20041210,10,2020 87881143,10,20, 60, 0,20041210,11,0201 87881143,10,10, 20, 0,20041210,11,1515
2)編寫awk腳本,并且存儲為:StatFee_Time.sh
[zengzc@ZCBILL bill_data]$ cat StatFee_Time.sh #!/bin/awk -f BEGIN \ { FS="," } { TimeList[$7]=$7 AllFeesPerPhone=$2+$3+$4+$5 Fee[$7]+=AllFeesPerPhone }; END \ { for (Row in TimeList) print "Time Section : "TimeList[Row]" All Fees :"Fee[Row] }
3)、使得腳本StatFee_Time.sh可執(zhí)行
chmod +x StatFee_Time.sh
4)執(zhí)行 ./StatFee_Time.sh Ticket_20041210_11_1,OK,得到結(jié)果:
[zengzc@ZCBILL bill_data]$ ./StatFee_Time.sh Ticket_20041210_11_1 Time Section : 09 All Fees :1110 Time Section : 10 All Fees :650 Time Section : 11 All Fees :130
附:切分話單中的日期的腳本: awk -F, '{print $1","$2","$3","$4","$5","substr($6,1,8)","substr($6,9,2)","substr($6,11,4)}' Ticket_20041210_11 >Ticket_20041210_11_1
|