lunixs三大基本文本處理工具:grep sed awk
字符處理用法均涉及正則表達(dá)式,我們先學(xué)習(xí)正則
REGEXP: regular expression
pattern:
正則表達(dá)式分為2類(lèi):
basic REGEXP:基本
Extended REGEXP:擴(kuò)展
基本正則表達(dá)式:
擴(kuò)展的正則表達(dá)式:
字符匹配:
·:任意單個(gè)字符
?:其前字符0次或1次
+:匹配其前字符至少1次
{m,n}:不用加反斜線,
分組:(),\1,\2,\3……
或者
a|b :or的意思
grep -e =egrep
fgrep:fast 快速搜索,不支持正則表達(dá)式
sed基本用法:
Stream Editor
? ? 行編輯器:逐行進(jìn)行(全屏編輯器:vi)
sed每次把一行讀取到模式空間,處理文本后輸出到屏幕,sed對(duì)原文件不做任何處理,僅對(duì)模式空間中的文件做處理。
sed:模式空間
sed? 'addressCommand'? file……
對(duì)這個(gè)文件中符合地址的行執(zhí)行該命令
Address:
? ? 1.StartLine,EndLine:1,100
? ? $:最后一行
? ? $-1:倒數(shù)第二行
? ? 2./RegExp/ :/^root/
? ? 3./pattern1/,/pattern2/ :第一次被模式1匹配到的行開(kāi)始到第一次被模式2匹配到的行結(jié)束。
? ? 4.LineNumber指定的行
? ? 5.StartLine,+N:從startLine行開(kāi)始,向后的N行,一共是N+1行。
command:
? ? d:刪除符合條件的行
? ? p:顯示符合條件的行(print)
? ? -n:靜默模式?????
不顯示模式空間的內(nèi)容,只顯示命令相關(guān)內(nèi)容
? ? a \string:在指定的行后面追加新行,內(nèi)容為"string"
? ? i \string:在指定的內(nèi)容前面添加新行,內(nèi)容為string
? ? r? filename:將指定文件的內(nèi)容添加至符合條件的行數(shù),$r,用于合并文件。
? ? w:將地址指定的范圍內(nèi)的內(nèi)容另存至指定文件中
? ? s/pattern/string/修飾符:查找并替換,將每一行中pattern替換成string,默認(rèn)只替換每行第一次遇到的模式匹配到的string
? ? ? ? 加修飾符
? ? ? ? ????g:全局替換
? ? ? ? ? ? i:忽略字符大小寫(xiě)
? ? ? ? s///:s###,s@@@
? ? ? ? l..e:
? ? ? ? &:引用模式匹配整個(gè)串
? ? ? ? 也支持后向引用
? ? ? ? -i:直接修改原文件
? ? ? ? -e script? -e? script:可以同時(shí)執(zhí)行多個(gè)腳本
? ? ? ? -f /PATH/TO/SED_SCRIPT:
? ? ? ? -r:表示使用擴(kuò)展正則表達(dá)式
練習(xí):將history中的空格刪除
? ? ? ? history | sed ‘s#[[:space:]]##g'
習(xí)題:1.刪除/etc/grub.conf文件中行首的空白符
sed? -r? 's@^ [[:space:]]+@@g'? /etc/grub.conf
? -r:表示使用擴(kuò)展正則表達(dá)式
? +:匹配其前字符至少1次
? ?g:全局替換
2.替換/etc/inittab文件中“id:3:initdefault:”一行中的數(shù)字為5;
sed? 's@\(id:\)[0-9]\(:initdefault:\)@\15\2@g'? /etc/inittab
????\(\) :分組
? ??\1:第一個(gè)左括號(hào)以及與之對(duì)應(yīng)得右括號(hào)包含得所有內(nèi)容
? ??\2:第二個(gè)左括號(hào)以及與之對(duì)應(yīng)得右括號(hào)包含得所有內(nèi)容
? ? [0-9]替換成5
3.刪除/etc/inittab文件中的空白行;
????sed? ?'/^$/d'? ?etc/inittab
? ???d:刪除符合條件的行
? ??^$:空白行
4.刪除/etc/inittab文件中開(kāi)通的#號(hào)
? ? sed? 's@^#@@g'? ?etc/inittab
????^:錨定行首,這個(gè)字符后面得字符串必須出現(xiàn)在行首
5.刪除某文件中開(kāi)頭的#號(hào)及后面的空白字符,但要求#號(hào)后面必須有空白字符;
? ? sed? -r? 's@#[[:space:]]+@@g'? ?/etc/inittab
? ???-r:表示使用擴(kuò)展正則表達(dá)式
? ??? +:匹配其前字符至少1次
6.刪除某文件中以空白字符后面跟#類(lèi)的行中開(kāi)頭的空白字符及#
? ? sed -r? 's@^[[:space:]]+#@@g'? ?/etc/inittab
7.取出一個(gè)文件路徑的目錄名稱(chēng);???
? ? echo? "/etc.rc.d" | sed -r? 's@^(/.*/)[^/]+/?@\1@'