sed与awk命令小结
1.sed命令小結
Sed是一個非交互式文本編輯器,它可對文本文件和標準輸入進行編輯,標準輸入可以是來自鍵盤輸入、文件重定向、字符串、變量,甚至來自管道的文本。Sed從文本的一個文本行或標準輸入中讀取數(shù)據(jù),將其復制到緩沖區(qū),然后讀取命令行或腳本的第一個命令,對此命令要求的行號進行編輯,重復此過程,直到命令行或腳本中的所有命令都執(zhí)行完畢。相對于vi等其他文本編輯器,sed可以一次性處理所有的編輯任務,顯得非常高效,為用戶節(jié)省了大量的時間。
1.?語法:sed [OPTION]... {script} [input-file]...
工作機制:每次讀取一行文本至“模式空間(pattern space)”中,在模式空間中完成處理;將處理結果輸出至標準輸出設備;
???-r支持擴展正則
???-n靜默模式:不輸出,只編輯
???-e script1 –e script2 –e script3多點編輯
???-f 從配置文件中讀取腳本,然后按腳本執(zhí)行
???-i 直接修改源文件;默認是不修改源文件的
?
地指定界:
??#:指定行
??$:最后一行
??/regexp/:能夠被regexp所匹配的行
??\%regexp%:同上
??/regexp/|\%regexp%忽略字符大小寫
開始行,結束行:
??#, /regexp/:從#開始,披到到/regexp/結束
??#,#1:#開始,#1結束
??/regexp1/,/regexp2/,從匹配1開始到匹配2結束
??#,+n:#開始,匹配之后的n行
? first~step:first開始,step步進
?
2.sed的編輯命令
(1)打印某行
sed -n 'n'p filename 單引號內(nèi)的n是一個數(shù)字,表示第幾行:
?
???
????????????#sed?-n?'2'p/etc/passwd要想把所有行都打印出來可以使用 sed -n '1,$'p filename
???
????????????#sed?-n?'1,$'p?/etc/passwd也可以指定一個區(qū)間:
? ?
????????????#sed?-n?'1,3'p?/etc/passwd???
?
(2)打印包含某個字符串的行
? ?
????????????#sed?-n?'/root/'p?/etc/passwdgrep中使用的特殊字符,如 ^ $ . * 等同樣也能在sed中使用
? ?
????????????#sed?-n?'/^root/'p/etc/passwd? ?
????????????#sed?-n?'/in$/'p?/etc/passwd?
(3)-e可以實現(xiàn)多個行為
? ?
????????????#sed?-e?'1'p?-e'/^ftp/'p?-n?/etc/passwd?
(4)刪除某行或者多行
? ?
????????????#sed?'1'd?/tmp/passwd? ?
????????????#sed?'1,3'd?/tmp/passwd? ?
????????????#sed?'/adm/'d?/tmp/passwd‘d’ 這個字符就是刪除的動作了,不僅可以刪除指定的單行以及多行,而且還可以刪除匹配某個字符的行,另外還可以刪除從某一行一直到文檔末行。
?
(5)替換字符或字符串
??? ?
????????????#sed?'1,2s/ot/to/g'/tmp/passwd上例中的 ‘s’ 就是替換的命令, ‘g’ 為本行中全局替換,如果不加 ‘g’ 只換該行中出現(xiàn)的第一個。除了可以使用‘/’ 作為分隔符外,還可以使用其他特殊字符例如 ‘#’ 或者‘@’ 都沒有問題。
?
(6)調換兩個字符串的位置
? ?
????????????#sed?'s/\(root\)\(.*\)\(bash\)/\3\2\1/'/tmp/passwd這個就需要解釋一下了,上例中用 () 把所想要替換的字符括起來成為一個整體,因為括號在sed中屬于特殊符號,所以需要在前面加脫意字符 ‘’, 替換時則寫成 ‘1’, ‘‘2’, ‘‘3’ 的形式。
?
(7)直接修改文件的內(nèi)容
? ?
????????????#sed?-i?'s/ot/to/g'?/tmp/passwd?
練習:
1、刪除/boot/grub/grub.conf文件中所有行首的空白字符
????????????#sed's/^[[:space:]]\+//'?/tmp/grub.conf?
2、刪除/etc/fstab文件中所有#開頭,后至少跟一個空白字符的行的行首的#和空白字符
????????????#sed's/^#[[:space:]]\+//'?/etc/fstab?
3、把/etc/fstab文件的奇數(shù)行另存為/tmp/fstab.3
????????????#sed'1~2w?/tmp/fstab.3'?/etc/fstab?
4、echo一個文件路徑給sed命令,取出其基名,進一步取出其路徑名
取基名:
????????????#echo?"/etc/sysconfig/network-scripts/"?|?sed's@^.*/\([^/]\+\)/\?$@\1@'取路徑名:
????????????#echo?"/etc/sysconfig/network-scripts/"?|?sed's@[^/]\+/\?$@@'?
3.高級命令:
保持空間,hold space
保存模式空間中的內(nèi)容
??? h:用模式空間內(nèi)容覆蓋保持空間內(nèi)容
??? H:用模式空間內(nèi)容追加保持空間內(nèi)容
??? g:從保持空間中取1行內(nèi)容覆蓋到模式空間
??? G:從保持空間取呢容追加模式空間
??? x:交換內(nèi)容
??? n:讀取匹配行下一行,覆蓋保持空間
??? N:讀取匹配行,追加保持空間
??? d:刪除模式空間的內(nèi)容
??? D:刪除多行模式空間中的首行
注意:命令功能可使用!取反;分號可用于分隔腳本;
?
示例:
在文件中的每行后方添加空白行;
????????????#sed?'G'?/etc/issue保留最后一行;
????????????#sed?'$!d'?/etc/fstab保證指定的文件每一行后方有且只有一個空白行;
????????????#sed?'/^$/d;G'?/etc/issue保留奇數(shù)行;
????????????#sed?'n;d'?/etc/issue?
?
2.???awk編程小結
awk是由Aho, Weinberger和Kernighan共同開發(fā)的編程語言。基本語法與C語言類似。
awk功能與sed相似,都是用來進行文本處理的,awk語言可以從文件或字符串中基于指定規(guī)則瀏覽和抽取信息,在抽取信息的基礎上,才能進行其他文本操作。
awk是一種編程語言,awk實際是指向gawk的符號鏈接。
?
1、基本語法
awk [options] 'program' file file ...
awk [options] 'PATTERN{action}' file file...
-F CHAR:輸入分隔符
?
2、awk的輸出:
print item1, item2,...
要點:
(1) 各項目之間使用逗號分隔,而輸出時則使用輸出分隔符分隔;
(2) 輸出的各item可以字符串或數(shù)值、當前記錄的字段、變量或awk的表達式;數(shù)值會被隱式轉換為字符串后輸出;
(3) print后面item如果省略,相當于print $0;輸出空白,使用pirnt "";
?
3、awk的變量
內(nèi)置變量,自定義變量
3.1 內(nèi)置變量
FS:Field Seperator, 輸入時的字段分隔符
示例:
????????#awk?'BEGIN{FS=":"}{print?$1,$7}'?/etc/passwd????????
RS:Record Seperator, 輸入行分隔符
OFS: Output Field Seperator, 輸出時的字段分隔符;
ORS: Outpput Row Seperator, 輸出時的行分隔符;
NF:Numbers of Field,字段數(shù)
NR:Numbers of Record, 行數(shù);所有文件的一并計數(shù);
FNR:行數(shù);各文件分別計數(shù);
ARGV:數(shù)組,保存命令本身這個字符,awk '{print $0}' 1.txt 2.txt,意味著ARGV[0]保存awk,
ARGC: 保存awk命令中參數(shù)的個數(shù);
FILENAME: awk正在處理的當前文件的名稱;
?
3.2 可自定義變量
???????? -v var_name=VALUE
?
???????? 變量名區(qū)分字符大小寫;
?
???????? (1) 可以program中定義變量;
???????? (2) 可以命令行中通過-v選項自定義變量;
?
4、awk的printf命令
命令的使用格式:printfformat, item1, item2,...
要點:
???????? (1) 要指定format;
???????? (2) 不會自動換行;如需換行則需要給出\n
???????? (3) format用于為后面的每個item指定其輸出格式;
???????? format格式的指示符都%開頭,后跟一個字符:
????????????????? %c: 顯示字符的ASCII碼;
????????????????? %d, %i: 十進制整數(shù);
????????????????? %e, %E: 科學計數(shù)法顯示數(shù)值;
????????????????? %f: 顯示浮點數(shù);
????????????????? %g, %G: 以科學計數(shù)法格式或浮點數(shù)格式顯示數(shù)值;
????????????????? %s: 顯示字符串;
????????????????? %u: 顯示無符號整數(shù);
????????????????? %%: 顯示%自身;
???????? 修飾符:
????????????????? #:顯示寬度
????????????????? -:左對齊
????????????????? +:顯示數(shù)值的符號
????????????????? .#: 取值精度
?
5、awk輸出重定向
print items > output-file
print items >> output-file
print items | command
?
特殊文件描述符:
/dev/stdin: 標準輸入
/dev/stdout: 標準輸出
/dev/stderr: 錯誤輸出
?
6、awk的操作符
算術操作符:
???????? x+y
???????? x-y
???????? x*y
???????? x/y
???????? x**y, x^y
???????? x%y
???????? -x:負值
???????? +x:轉換為數(shù)值
?
字符串操作符:連接
?
???????? 賦值操作符:
????????????????? =
????????????????? +=
????????????????? -=
????????????????? *=
????????????????? /=
????????????????? %=
????????????????? ^=
????????????????? **=
????????????????? ++
????????????????? --
????????????????? 如果模式自身是=號,要寫為/=/
?
???????? 比較操作符:
????????????????? <
????????????????? <=
????????????????? >
????????????????? >=
????????????????? ==
????????????????? !=
????????????????? ~:模式匹配,左邊的字符串能夠被右邊的模式所匹配為真,否則為假;
????????????????? !~: 與上面相反
?
???????? 邏輯操作符:
????????????????? &&: 與
????????????????? ||:或
?
???????? 條件表達式:
???????? selector?if-true-expression:if-false-expression
?
示例:
? ? ? ? ?
????????#awk?-F:?'{$3>=1000?utype="commonuser":utype="admin?or?system?user";print$1,"is",utype}'?/etc/passwd????????
?
???????? 函數(shù)調用:
????????????????? function_name(argu1,argu2)
?
7、模式
(1) Regexp: 格式為/PATTERN/
????????????????? 僅處理被/PATTERN/匹配到的行;
(2) Expression: 表達式,其結果為非0或非空字符串時滿足條件;
????????????????? 僅處理滿足條件的行;
(3) Ranges: 行范圍,此前地址定界,
????????????????? NR
????????????????? 僅處理范圍內(nèi)的行
(4) BEGIN/END: 特殊模式,僅在awk命令的program運行之前(BEGIN)或運行之后(END)執(zhí)行一次;
(5) Empty:空模式,匹配任意行;
?
8、常用的action
(1) Expressions
(2) Control statements
(3) Compound statements
(4) input statements
(5) output statements
?
9、控制語句
9.1 if-else
???????? 格式:if(condition) {then body} else {else body}
示例:
? ? ?
????????#awk?-F:?'{if($3>=500)?{print?$1,"is?a?common?user"}?else?{print?$1,?"isan?admin?or?system?user"}}'?/etc/passwd? ? ?
????????#awk?'{if?(NF>=8){print}}'?/etc/inittab?
9.2 while
???????? 格式:while(condition) {while body}
示例:
? ? ? ?
????????#awk?'{i=1;?while(i<=NF){printf?"%s?",$i;i+=2};print?""}'?/etc/inittab?
? ? ? ? ?
????????#awk?'{i=1;?while(i<=NF){if?(length($i)>=6)?{print?$i};?i++}}'?/etc/inittab?
????
???????? length()函數(shù):取字符串的長度
?
9.3 do-while循環(huán)
???????? 格式:do{do-while body} while (condition)
?
9.4 for循環(huán)
???????? 格式:for(variable assignment; condition; iteration process) {for body}
示例:
? ? ? ? ?
????????#awk?'{for(i=1;i<=NF;i+=2){printf?"%s?",$i};print?""}'/etc/initta? ? ? ?
????????#awk?'{for(i=1;i<=NF;i++){if?(length($i)>=6)?print?$i}}'?/etc/inittab?
???????? for循環(huán)可用來遍歷數(shù)組元素:
????????????????? 語法:for (i inarray) {for body}
?
9.5 case語句
???????? 語法:switch(expression) {case VALUE or /RGEEXP/: statement1;... default: stementN}
?
9.6 循環(huán)控制
???????? break
???????? continue
?
9.7 next
???????? 提前結束對本行的處理進而提前進入下一行的處理;
? ? ?
????????#awk?-F:?'{if($3%2==0)next;print?$1,$3}'?/etc/passwd? ? ? ?
????????#awk?-F:?'{if(NR%2==0)?next;print?NR,$1}'?/etc/passwd?
10、數(shù)組
傳統(tǒng)數(shù)組:Index編號從1開始;
關聯(lián)數(shù)組:
???????? array[index-expression]
???????? index-expression: 可以使用任意字符串; 如果某數(shù)組元素事先不存在,那么在引用時,awk會自動創(chuàng)建此元素并將其初始化為空串;因此,要判斷某數(shù)組是否存在某元素,必須使用“index in array”這種格式;
?
????????????????? A[first]="helloawk"
????????????????? printA[second]
?
???????? 要遍歷數(shù)組中的每一個元素,需要使用如下特殊結構:
????????????????? for (var inarray) {for body}
????????????????? 其var會遍歷array的索引;
????????????????? state[LISTEN]++
????????????????? state[ESTABLISHED]++
?
示例:
? ? ? ? ? ? ? ?
????????#netstat?-tan|?awk?'/^tcp/{++state[$NF]}END{for?(s?in?state)?{print?s,state[s]}}'????????????????? ????????
刪除數(shù)組元素:
???????? delete array[index]
?
11、awk的內(nèi)置函數(shù)
split(string,array[,fieldsep[,seps]]):
???????? 功能:將string表示的字符串以fieldsep為分隔符進行切片,并切片后的結果保存至array為名的數(shù)組中;數(shù)組下標從1開始;
???????? ???????? root:x:0:0::/root:/bin/bash
???????? ???????? user[1]="root", user[2]
???????? 此函數(shù)有返回值,返回值為切片后的元素的個數(shù)
?
示例:
?
????????#netstat?-tn?|?awk'/^tcp/{lens=split($5,client,":");ip[client[1]]++}END{for?(i?in?ip)print?i,ip[i]}'???????
?
length(string)
???????? 功能:返回給定字串的長度
?
substr(string,start[,length])
???????? 功能:從string中取子串,從start為起始位置為取length長度的子串;
?
?
轉載于:https://blog.51cto.com/2280627/1697863
總結
以上是生活随笔為你收集整理的sed与awk命令小结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OPPO打造!唯一配备潜望长焦的天玑旗舰
- 下一篇: Logistic 回归(sigmoid函