日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言再学习 -- grep 命令(转)

發布時間:2025/3/15 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言再学习 -- grep 命令(转) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

grep(global search regular expression(RE) and print out the line,全面搜索正則表達式并把行打印出來)是一種強大的文本搜索工具,它能使用正則表達式搜索文本,并把匹配的行打印出來。

一、選項

$ grep --h 用法: grep [選項]... PATTERN [FILE]... 在每個 FILE 或是標準輸入中查找 PATTERN。 默認的 PATTERN 是一個基本正則表達式(縮寫為 BRE)。 例如: grep -i 'hello world' menu.h main.c正則表達式選擇與解釋:-E, --extended-regexp PATTERN 是一個可擴展的正則表達式(縮寫為 ERE) -F, --fixed-strings PATTERN 是一組由斷行符分隔的定長字符串。 -G, --basic-regexp PATTERN 是一個基本正則表達式(縮寫為 BRE) -P, --perl-regexp PATTERN 是一個 Perl 正則表達式 -e, --regexp=PATTERNPATTERN 來進行匹配操作 -f, --file=FILEFILE 中取得 PATTERN -i, --ignore-case 忽略大小寫 -w, --word-regexp 強制 PATTERN 僅完全匹配字詞 -x, --line-regexp 強制 PATTERN 僅完全匹配一行 -z, --null-data 一個 0 字節的數據行,但不是空行 雜項:-s, --no-messages 不顯示錯誤信息 -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 假定二進制文件的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 操作設備、先入先出隊列、套接字的方式; 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 只打印每個FILE 中的匹配行數目 -T, --initial-tab 行首tabs 分隔(如有必要) -Z, --null 在FILE 文件最后打印空字符 文件控制:-B, --before-context=NUM 打印以文本起始的NUM -A, --after-context=NUM 打印以文本結尾的NUM -C, --context=NUM 打印輸出文本NUM -NUM 等同于 --context=NUM --color[=WHEN], --colour[=WHEN] 使用標志高亮匹配字串; WHEN 可以是`always', `never'或`auto'-U, --binary 不要清除行尾的CR 字符(MSDOS 模式) -u, --unix-byte-offsets 當CR 字符不存在,報告字節偏移(MSDOS 模式) ‘egrep’即‘grep -E’。‘fgrep’即‘grep -F’。 直接使用‘egrep’或是‘fgrep’均已不可行了。 不帶 FILE 參數,或是 FILE 為 -,將讀取標準輸入。如果少于兩個 FILE 參數 就要默認使用 -h 參數。如果選中任意一行,那退出狀態為 0,否則為 1; 如果有錯誤產生,且未指定 -q 參數,那退出狀態為 2。請將錯誤報告給: bug-grep@gnu.org GNU Grep 主頁: <http://www.gnu.org/software/grep/> GNU 軟件的通用幫助: <http://www.gnu.org/gethelp/>

二、實例

參看:grep命令中文手冊
參看:grep命令
以下是一些GNU grep的使用示例:

grep -i 'hello.*world' menu.h main.c

該命令用于列出menu.h和main.c中包含”hello”字符串且后面帶有”world”字符串的所有行,hello和world中間可以有任意多個字符。注意正則表達式的”-i”選項使得grep忽略大小寫,所以還能匹配”Hello, world!”。
下面是一些使用grep時常見的問題和答案。
1、如何列出匹配的文件名?

grep -l 'main' *.c

將列出當前目錄下所有以”.c”結尾且文件中包含’main’字符串的文件名。

2、如何遞歸搜索目錄?

grep -r 'hello' /home/gigi

搜索/home/gigi目錄下所有文件,且文件中包含’hello’字符串。如果要靈活控制搜索的文件,可以結合find和xargs命令一起使用。例如下面的例子僅搜索C源文件。

find /home/gigi -name '*.c' -print0 | xargs -0r grep -H 'hello'

這不同于下面的命令:

grep -rH 'hello' *.c

這僅僅只是搜索當前目錄下以”.c”結尾的文件。此處的”-r”選項基本上算是多余的,除非當前目錄下有以”.c”結尾的目錄,但這是很少見的情況。上面的find命令更類似于下面的命令:

grep -rH --include='*.c' 'hello' /home/gigi

3、如果pattern以短橫線”-“開頭會如何?

grep -e '--cut here--' *

將搜索”–cut here–”。但如果不給定”-e”選項,grep將可能把”–cut here”解析成一系列的選項。

4、如何搜索整個單詞,而不是單詞中的一部分?

grep -w 'hello' *

這將搜索當前目錄下所有文件,并找出包含”hello”整個單詞的文件,它無法匹配”Othello”。更靈活的控制可以使用”\<”和”>”來匹配單詞的開始和結尾。例如:

grep 'hello\>' *

僅搜索”hello”結尾的單詞,因此可以匹配”Othello”。

5、如何輸出匹配行的上下幾行?

grep -C 2 'hello' *

這將輸出匹配行以及它的前后兩行。

6、如何強制grep即輸出匹配行又輸出文件名? 只需在文件列表中加上’/dev/null’即可。

grep 'eli' /etc/passwd /dev/null

將得到:

/etc/passwd:eli:x:2098:1000:Eli Smith:/home/eli:/bin/bash

還可以使用GNU擴展選項”-H”:

grep -H 'eli' /etc/passwd

7、為什么有人在ps的后面使用奇怪的正則表達式?

ps -ef | grep '[c]ron'

如果pattern中不加上中括號,將匹配包含cron字符串的進程,包括grep自身,因為grep命令的表達式中包含了cron字符串。但如果加上了中括號,則grep命令行中包含的是”[c]ron”字符串,而grep所匹配的字符串是cron而不是[c]ron。 在輸出結果上,這其實等價于下面這條命令:

ps -ef | grep 'cron' | grep -v 'grep'

8、為什么grep的結果中會報告”Binary file matches”?
如果grep列出二進制文件中的所有匹配行,將很可能生成一大堆亂七八糟的無用信息,因此GNU的grep默認禁止這樣的輸出。如果想要輸出二進制內容,使用”-a”或”–binary-files=text”選項。

9、為什么’grep -lv’輸出的是包含非匹配行的文件名?
‘grep -lv’列出的是包含一行或多行非匹配行的文件名。如果想要列出無匹配內容的文件名,則使用”-L”選項。 (注:例如a.txt中一部分行匹配到了,一部分行沒匹配到,而b.txt中完全沒有匹配上,則grep -lv將輸出a.txt,而不是b.txt。因此可推測”-v”選項的操作優先級要高于”-l”,即先搜索出反轉行,再輸出包含這些反轉行的文件)

10、使用”|”可以實現or邏輯,如何實現AND邏輯?

grep 'paul' /etc/motd | grep 'franc,ois'

將搜索出同時包含”paul”和”franc,ois”的所有行。

11、如何同時搜索文件和標準輸入?
只需使用”-“代替標準輸入的文件名即可:

cat /etc/passwd | grep 'alain' - /etc/motd

12、正則表達式中如何表達出回文結構?(注:回文結構表示正讀和反讀的結果是一樣的,例如12321,abcba)可以使用反向引用來實現。例如,一個4字符的結構使用BRE來實現:

grep -w -e '\(.\)\(.\).\2\1' file

它可以匹配單詞”radar”或”civic”。 Guglielmo Bondioni提出了一個正則表達式,可以搜索長達19個回文結構的字符串,其中使用了9個子表達式和9個反向引用。因為BRE或ERE最多只支持9個反向引用。

grep -E -e '^(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?).?\9\8\7\6\5\4\3\2\1$' file

13、為何反向引用會失效?

echo 'ba' | grep -E '(a)\1|b\1'

這不會輸出任何內容,因為左邊的表達式”(a)\1”無法匹配,因為輸入數據中沒有”aa”,因此右邊的”\1”無法引用任何內容,意味著將不匹配任何東西。(此例中右邊表達式僅在左邊表達式成功匹配時才能生效。)
注:經測試,即使左邊表達式能匹配上,右邊表達式中引用左邊的分組時也無效。例如”echo ‘baaca’ | grep -E ‘(a)\1|c\1’”可以匹配大其中的”aa”,但卻匹配不到”ca”。

14、grep如何跨行匹配?
標準的grep無法實現該功能,因為它是基于行讀取的。因此,僅僅使用字符類”[:space:]”無法如你想象中那樣匹配換行符。
GNU的grep有一個選項”-z”,它可以處理使用”\0”結尾的行。因此,可以匹配輸入數據中的換行符,但通常很可能在輸出結果時,輸出的是所有內容而不僅是被匹配的行,因此經常需要結合輸出控制選項如”-q”來使用。例如:

printf 'foo\nbar\nabc' | grep -z 'foo[[:space:]]\+bar' printf 'foo\nbar\nabc' | grep -z -q 'foo[[:space:]]\+bar'

如果這還不滿足需求,可以將輸入數據進行格式轉換然后交給grep,或者使用其他工具替代grep,如”sed”、”awk”、”perl”或其他很多工具都能跨行操作。
15、“grep”,“fgrep”和“egrep”代表什么?
‘grep’這個名字來自于在Unix上進行行編輯的方式。 例如,’ed’使用以下語法在屏幕上打印匹配行的列表:

global/regular expression/print g/re/p

‘fgrep’代表固定’grep’; ‘egrep’代表擴展的’grep’。

總結

以上是生活随笔為你收集整理的C语言再学习 -- grep 命令(转)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。