Linux文件處理三劍客
-
grep : 文本過濾工具
- 支持基礎(chǔ)正則表達(dá)式
- -E 支持?jǐn)U展正則表達(dá)式
- -F 支持快遞過濾(在不匹配正則表達(dá)式的情況下)
- 其中有egrep,其不用-E參數(shù),直接支持?jǐn)U展正則表達(dá)式
- 其中有fgrep,其不用-F參數(shù),直接支持快速搜索
sed : stream editor,流編輯器,使用-r參數(shù),支持正則表達(dá)式
awk : linux上的實(shí)現(xiàn)為gawk,格式化輸出文本,一般情況用于生成報(bào)告,且支持正則表達(dá)式
基本正則表達(dá)式(Basic regual expression,regexp)
基本正則表達(dá)式元字符
-
字符匹配
- . : 匹配任意單個(gè)字符
- [] : 匹配指定范圍的任意字符
- [^] : 匹配指定范圍外的任意字符
- [:upper:] [:lower:] [:alpha:] [:alnum:] [:digit:][:punct:] [:space:]
-
匹配次數(shù)
* : 匹配其前面的字符任意次,0次、1次或者多次;
* 例如:grep “xy”
abxy
aby
xxxxxy
yab
注意:匹配任意長(zhǎng)度的任意字符,同glob里的號(hào)? : 匹配其前面的字符0次或1次,即前面的字符,可有可無;
* 例如:grep “x?y”
abxy
aby
xxxxxy
yab\+ : 匹配其前面的字符至少1次或多次,即前面的字符至少需要出現(xiàn)一次
* 例如:grep “x+y”
abxy
xxxxxy{m} : 匹配其前面的字符M次
{m,n} : 匹配其前面的字符至少M(fèi)次,最多N次
{0,n} : 匹配其前面的字符最多N次
{m,} : 匹配其前面的字符至少M(fèi)次
-
位置錨定
- ^ :錨定行首,用于模式的最左側(cè)
- $ :錨定行尾,用于模式的最右側(cè)
- \< 或者\(yùn)b :錨定詞首,用于單詞的最左側(cè)
- \> 或者\(yùn)b :錨定詞尾,用于單詞的最右側(cè)
-
分組及引用
- \( \) : 將一個(gè)或者多個(gè)字符捆綁在一起,當(dāng)作一個(gè)整體
- \1,\2,\3... : 向后引用前面被匹配到的第一個(gè)、第二個(gè)、第三個(gè)...
- 注意:分組括號(hào)中的模式匹配到的內(nèi)容會(huì)被正則表達(dá)式引擎自動(dòng)記錄于內(nèi)部的變量中,變量為\1,\2,\3....
擴(kuò)展正則表達(dá)式元字符
-
字符匹配
- . : 任意單個(gè)字符
- [] : 指定范圍內(nèi)的任意字符
- [^] : 指定范圍外的任意字符
-
次數(shù)匹配
- . : 任意次,匹配0次,1次或多次
- ? : 0次或者1次,表示前面的字符可有可元
- + : 其前面的字符最少一次,1次或者多次
- {m} : 匹配其前面的m次
- {m,n} : 匹配其前面的至少M(fèi)次,至多N次
- {0,n} : 匹配其前面的最多N次
- {m,} : 匹配其前面的最少M(fèi)次
-
位置錨定
- ^ :錨定行首,用于模式的最左側(cè)
- $ :錨定行尾,用于模式的最右側(cè)
- \< 或者\(yùn)b :錨定詞首,用于單詞的最左側(cè)
- \> 或者\(yùn)b :錨定詞尾,用于單詞的最右側(cè)
-
分組及引用
- \( \) : 將一個(gè)或者多個(gè)字符捆綁在一起,當(dāng)作一個(gè)整體
- \1,\2,\3... : 向后引用前面被匹配到的第一個(gè)、第二個(gè)、第三個(gè)...
- 注意:分組括號(hào)中的模式匹配到的內(nèi)容會(huì)被正則表達(dá)式引擎自動(dòng)記錄于內(nèi)部的變量中,變量為\1,\2,\3....
-
或
- | : 或者,或者整個(gè)左邊和整個(gè)右邊
- 例:
- a|b: a或者b
- C|cat :C或cat
- (C|c)at: 表示cat和Cat
- 例:
- | : 或者,或者整個(gè)左邊和整個(gè)右邊
練習(xí):
找出/proc/meminfo文件中,所有以大寫或小寫s開頭的行,至少三種實(shí)現(xiàn)方式
* cat /proc/meminfo | grep -E ‘^(s|S)’
* cat /proc/meminfo | grep ‘^[sS]’
* cat /proc/meminfo | grep -i ‘^s'顯示當(dāng)前系統(tǒng)上root、centos、或者user1用戶的相關(guān)信息
*cat /etc/passwd | grep -E “^(root|centos|user1)\>"
找出/etc/rc.d/init.d/functions文件中某單詞后面跟一個(gè)小括號(hào)的行
*cat /etc/rc.d/init.d/functions | grep -Eo “[_[:alnum:]]+\(\)"
使用echo命令輸出一絕對(duì)路徑,使用grep取出其基名
*ehco /etc/sysconfig/network-scripts/ifcfg-eth0 | grep -Eo "\<[^/]+/?$”
進(jìn)一步:取出其路徑名,類似于對(duì)其執(zhí)行dirname命令的結(jié)果
* `echo /etc/sysconfig/network-scripts/ifcfg-eth0 | grep -o "^/.*/"找出ifconfig命令結(jié)果中的1-255之間的數(shù)值
*ifconfig | grep -E "[1-9]|[0-9][1-9]|1[0-9][0-9]|2[0-5][0-5]"
課外作業(yè):找出ifconfig命令結(jié)果中的IP地址
添加用戶bash,testbash,basher以及nologin(其shell為/sbin/nolgin);而后找出/etc/passwd文件用戶名同shell名的行
*cat /etc/passwd | grep -E "^(\<.*\>):.*\1$”
*grep -E “^[^:]+\>” /etc/passwd
*grep -E “^([^:]+\>).*\1$” /etc/passwd
grep命令
-
grep - grep, egrep, fgrep - print lines matching a pattern
synopsis: grep [OPTIONS] PATTERN [FILE...] grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...] options: -e : 指定多個(gè)pattern -f : 把pattern放到文件里,從文件里讀取 --color=auto : 對(duì)匹配到的文本高亮顯示 -i : ignorecase,不區(qū)分大小寫 -o : 只顯示匹配到的本身 -v : --invert-match,反向顯示,顯示不能匹配到的行 -E : --extend-regexp,支持?jǐn)U展正則表達(dá)式元字符 -F : 快速搜索,等于直接使用fgrep命令 -q : --quiet,--silent,靜默模式,即不輸出任何信息,一般在腳本中使用 -A # : (after)顯示匹配到的行,后#行 -B # : (before)顯示匹配到的行,前#行 -C # : (context),顯示匹配到的行,前后各#行 -n : 顯示行號(hào)
- 例: cat /etc/rc.d/init.d/functions | grep -E2 "^[_[:alnum:]]+\(\)"
- 解釋:過濾functions文件中,以單詞或者單詞前面跟了一個(gè)"_"開頭的行,并顯示前后2行,這里的2相當(dāng)于 -C 2,或者可以直接寫成-2,
- 例: cat /etc/rc.d/init.d/functions | grep -E2 "^[_[:alnum:]]+\(\)"
練習(xí):
- /etc/passwd文件中不以/bin/bash結(jié)尾的行
grep -v "/bin/bash" /etc/passwd
- 找出/etc/passwd文件中兩位數(shù)或三位數(shù)
grep "\<\([[:digit:]]\)\{2,3\}\>" /etc/passwd
- 找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg g文件中,以至少一個(gè)空白字符開頭,且后面存在非空白字符的行
grep "^[[:space:]]\+[^[:space:]]" /etc/grub.conf
- 找出netstat -tan命令的結(jié)果中以LISTEN后面跟0個(gè)、1個(gè)或者多個(gè)空白字符結(jié)尾的行
netstat -tan | grep "LISTEN[[:space:]]*”