C语言再学习 -- grep 命令(转)
grep(global search regular expression(RE) and print out the line,全面搜索正則表達(dá)式并把行打印出來)是一種強(qiáng)大的文本搜索工具,它能使用正則表達(dá)式搜索文本,并把匹配的行打印出來。
一、選項(xiàng)
$ grep --h 用法: grep [選項(xiàng)]... PATTERN [FILE]... 在每個(gè) FILE 或是標(biāo)準(zhǔn)輸入中查找 PATTERN。 默認(rèn)的 PATTERN 是一個(gè)基本正則表達(dá)式(縮寫為 BRE)。 例如: grep -i 'hello world' menu.h main.c正則表達(dá)式選擇與解釋:-E, --extended-regexp PATTERN 是一個(gè)可擴(kuò)展的正則表達(dá)式(縮寫為 ERE) -F, --fixed-strings PATTERN 是一組由斷行符分隔的定長字符串。 -G, --basic-regexp PATTERN 是一個(gè)基本正則表達(dá)式(縮寫為 BRE) -P, --perl-regexp PATTERN 是一個(gè) Perl 正則表達(dá)式 -e, --regexp=PATTERN 用 PATTERN 來進(jìn)行匹配操作 -f, --file=FILE 從 FILE 中取得 PATTERN -i, --ignore-case 忽略大小寫 -w, --word-regexp 強(qiáng)制 PATTERN 僅完全匹配字詞 -x, --line-regexp 強(qiáng)制 PATTERN 僅完全匹配一行 -z, --null-data 一個(gè) 0 字節(jié)的數(shù)據(jù)行,但不是空行 雜項(xiàng):-s, --no-messages 不顯示錯(cuò)誤信息 -v, --invert-match 選中不匹配的行 -V, --version 顯示版本信息并退出 --help 顯示此幫助并退出 --mmap 忽略向后兼容性 Output control:-m, --max-count=NUM stop after NUM matches -b, --byte-offset print the byte offset with output lines -n, --line-number print line number with output lines --line-buffered flush output on every line -H, --with-filename print the file name for each match -h, --no-filename suppress the file name prefix on output --label=LABEL use LABEL as the standard input file name prefix -o, --only-matching 只顯示一行中匹配PATTERN 的部分 -q, --quiet, --silent 不顯示所有輸出 --binary-files=TYPE 假定二進(jìn)制文件的TYPE 類型; TYPE 可以是`binary', `text', 或`without-match'-a, --text 等同于 --binary-files=text -I 等同于 --binary-files=without-match -d, --directories=ACTION 操作目錄的方式; ACTION 可以是`read', `recurse',或`skip'-D, --devices=ACTION 操作設(shè)備、先入先出隊(duì)列、套接字的方式; ACTION 可以是`read'或`skip'-R, -r, --recursive 等同于 --directories=recurse --include=FILE_PATTERN 只查找匹配FILE_PATTERN 的文件 --exclude=FILE_PATTERN 跳過匹配FILE_PATTERN 的文件和目錄 --exclude-from=FILE 跳過所有除FILE 以外的文件 --exclude-dir=PATTERN 跳過所有匹配PATTERN 的目錄。 -L, --files-without-match 只打印不匹配FILEs 的文件名 -l, --files-with-matches 只打印匹配FILES 的文件名 -c, --count 只打印每個(gè)FILE 中的匹配行數(shù)目 -T, --initial-tab 行首tabs 分隔(如有必要) -Z, --null 在FILE 文件最后打印空字符 文件控制:-B, --before-context=NUM 打印以文本起始的NUM 行 -A, --after-context=NUM 打印以文本結(jié)尾的NUM 行 -C, --context=NUM 打印輸出文本NUM 行 -NUM 等同于 --context=NUM --color[=WHEN], --colour[=WHEN] 使用標(biāo)志高亮匹配字串; WHEN 可以是`always', `never'或`auto'-U, --binary 不要清除行尾的CR 字符(MSDOS 模式) -u, --unix-byte-offsets 當(dāng)CR 字符不存在,報(bào)告字節(jié)偏移(MSDOS 模式) ‘egrep’即‘grep -E’。‘fgrep’即‘grep -F’。 直接使用‘egrep’或是‘fgrep’均已不可行了。 不帶 FILE 參數(shù),或是 FILE 為 -,將讀取標(biāo)準(zhǔn)輸入。如果少于兩個(gè) FILE 參數(shù) 就要默認(rèn)使用 -h 參數(shù)。如果選中任意一行,那退出狀態(tài)為 0,否則為 1; 如果有錯(cuò)誤產(chǎn)生,且未指定 -q 參數(shù),那退出狀態(tài)為 2。請(qǐng)將錯(cuò)誤報(bào)告給: bug-grep@gnu.org GNU Grep 主頁: <http://www.gnu.org/software/grep/> GNU 軟件的通用幫助: <http://www.gnu.org/gethelp/>二、實(shí)例
參看:grep命令中文手冊(cè)
參看:grep命令
以下是一些GNU grep的使用示例:
該命令用于列出menu.h和main.c中包含”hello”字符串且后面帶有”world”字符串的所有行,hello和world中間可以有任意多個(gè)字符。注意正則表達(dá)式的”-i”選項(xiàng)使得grep忽略大小寫,所以還能匹配”Hello, world!”。
下面是一些使用grep時(shí)常見的問題和答案。
1、如何列出匹配的文件名?
將列出當(dāng)前目錄下所有以”.c”結(jié)尾且文件中包含’main’字符串的文件名。
2、如何遞歸搜索目錄?
grep -r 'hello' /home/gigi搜索/home/gigi目錄下所有文件,且文件中包含’hello’字符串。如果要靈活控制搜索的文件,可以結(jié)合find和xargs命令一起使用。例如下面的例子僅搜索C源文件。
find /home/gigi -name '*.c' -print0 | xargs -0r grep -H 'hello'這不同于下面的命令:
grep -rH 'hello' *.c這僅僅只是搜索當(dāng)前目錄下以”.c”結(jié)尾的文件。此處的”-r”選項(xiàng)基本上算是多余的,除非當(dāng)前目錄下有以”.c”結(jié)尾的目錄,但這是很少見的情況。上面的find命令更類似于下面的命令:
grep -rH --include='*.c' 'hello' /home/gigi3、如果pattern以短橫線”-“開頭會(huì)如何?
grep -e '--cut here--' *將搜索”–cut here–”。但如果不給定”-e”選項(xiàng),grep將可能把”–cut here”解析成一系列的選項(xiàng)。
4、如何搜索整個(gè)單詞,而不是單詞中的一部分?
grep -w 'hello' *這將搜索當(dāng)前目錄下所有文件,并找出包含”hello”整個(gè)單詞的文件,它無法匹配”O(jiān)thello”。更靈活的控制可以使用”\<”和”>”來匹配單詞的開始和結(jié)尾。例如:
grep 'hello\>' *僅搜索”hello”結(jié)尾的單詞,因此可以匹配”O(jiān)thello”。
5、如何輸出匹配行的上下幾行?
grep -C 2 'hello' *這將輸出匹配行以及它的前后兩行。
6、如何強(qiáng)制grep即輸出匹配行又輸出文件名? 只需在文件列表中加上’/dev/null’即可。
grep 'eli' /etc/passwd /dev/null將得到:
/etc/passwd:eli:x:2098:1000:Eli Smith:/home/eli:/bin/bash還可以使用GNU擴(kuò)展選項(xiàng)”-H”:
grep -H 'eli' /etc/passwd7、為什么有人在ps的后面使用奇怪的正則表達(dá)式?
ps -ef | grep '[c]ron'如果pattern中不加上中括號(hào),將匹配包含cron字符串的進(jìn)程,包括grep自身,因?yàn)間rep命令的表達(dá)式中包含了cron字符串。但如果加上了中括號(hào),則grep命令行中包含的是”[c]ron”字符串,而grep所匹配的字符串是cron而不是[c]ron。 在輸出結(jié)果上,這其實(shí)等價(jià)于下面這條命令:
ps -ef | grep 'cron' | grep -v 'grep'8、為什么grep的結(jié)果中會(huì)報(bào)告”Binary file matches”?
如果grep列出二進(jìn)制文件中的所有匹配行,將很可能生成一大堆亂七八糟的無用信息,因此GNU的grep默認(rèn)禁止這樣的輸出。如果想要輸出二進(jìn)制內(nèi)容,使用”-a”或”–binary-files=text”選項(xiàng)。
9、為什么’grep -lv’輸出的是包含非匹配行的文件名?
‘grep -lv’列出的是包含一行或多行非匹配行的文件名。如果想要列出無匹配內(nèi)容的文件名,則使用”-L”選項(xiàng)。 (注:例如a.txt中一部分行匹配到了,一部分行沒匹配到,而b.txt中完全沒有匹配上,則grep -lv將輸出a.txt,而不是b.txt。因此可推測”-v”選項(xiàng)的操作優(yōu)先級(jí)要高于”-l”,即先搜索出反轉(zhuǎn)行,再輸出包含這些反轉(zhuǎn)行的文件)
10、使用”|”可以實(shí)現(xiàn)or邏輯,如何實(shí)現(xiàn)AND邏輯?
grep 'paul' /etc/motd | grep 'franc,ois'將搜索出同時(shí)包含”paul”和”franc,ois”的所有行。
11、如何同時(shí)搜索文件和標(biāo)準(zhǔn)輸入?
只需使用”-“代替標(biāo)準(zhǔn)輸入的文件名即可:
12、正則表達(dá)式中如何表達(dá)出回文結(jié)構(gòu)?(注:回文結(jié)構(gòu)表示正讀和反讀的結(jié)果是一樣的,例如12321,abcba)可以使用反向引用來實(shí)現(xiàn)。例如,一個(gè)4字符的結(jié)構(gòu)使用BRE來實(shí)現(xiàn):
grep -w -e '\(.\)\(.\).\2\1' file它可以匹配單詞”radar”或”civic”。 Guglielmo Bondioni提出了一個(gè)正則表達(dá)式,可以搜索長達(dá)19個(gè)回文結(jié)構(gòu)的字符串,其中使用了9個(gè)子表達(dá)式和9個(gè)反向引用。因?yàn)锽RE或ERE最多只支持9個(gè)反向引用。
grep -E -e '^(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?).?\9\8\7\6\5\4\3\2\1$' file13、為何反向引用會(huì)失效?
echo 'ba' | grep -E '(a)\1|b\1'這不會(huì)輸出任何內(nèi)容,因?yàn)樽筮叺谋磉_(dá)式”(a)\1”無法匹配,因?yàn)檩斎霐?shù)據(jù)中沒有”aa”,因此右邊的”\1”無法引用任何內(nèi)容,意味著將不匹配任何東西。(此例中右邊表達(dá)式僅在左邊表達(dá)式成功匹配時(shí)才能生效。)
注:經(jīng)測試,即使左邊表達(dá)式能匹配上,右邊表達(dá)式中引用左邊的分組時(shí)也無效。例如”echo ‘baaca’ | grep -E ‘(a)\1|c\1’”可以匹配大其中的”aa”,但卻匹配不到”ca”。
14、grep如何跨行匹配?
標(biāo)準(zhǔn)的grep無法實(shí)現(xiàn)該功能,因?yàn)樗腔谛凶x取的。因此,僅僅使用字符類”[:space:]”無法如你想象中那樣匹配換行符。
GNU的grep有一個(gè)選項(xiàng)”-z”,它可以處理使用”\0”結(jié)尾的行。因此,可以匹配輸入數(shù)據(jù)中的換行符,但通常很可能在輸出結(jié)果時(shí),輸出的是所有內(nèi)容而不僅是被匹配的行,因此經(jīng)常需要結(jié)合輸出控制選項(xiàng)如”-q”來使用。例如:
如果這還不滿足需求,可以將輸入數(shù)據(jù)進(jìn)行格式轉(zhuǎn)換然后交給grep,或者使用其他工具替代grep,如”sed”、”awk”、”perl”或其他很多工具都能跨行操作。
15、“grep”,“fgrep”和“egrep”代表什么?
‘grep’這個(gè)名字來自于在Unix上進(jìn)行行編輯的方式。 例如,’ed’使用以下語法在屏幕上打印匹配行的列表:
‘fgrep’代表固定’grep’; ‘egrep’代表擴(kuò)展的’grep’。
總結(jié)
以上是生活随笔為你收集整理的C语言再学习 -- grep 命令(转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle存储过程快速入门
- 下一篇: S5PV210开发 -- USB 你知道