從這篇開始,是文本內(nèi)容操作,區(qū)別于文本操作。
Linux系統(tǒng)中g(shù)rep命令是一種強(qiáng)大的文本搜索工具,它能使用正則表達(dá)式搜索文本,并把匹 配的行打印出來。grep全稱是Global Regular Expression Print,表示全局正則表達(dá)式版本,它的使用權(quán)限是所有用戶。
shell,perl,python,一直都是文本操作的專家語言,而我們今后學(xué)習(xí)的的將是shell的噱頭--文本操作。下面提到最常見的一個(gè):
grep
這算是文本內(nèi)容的一個(gè)重量級選手,能根據(jù)某些規(guī)格在上千行的文本文件中查找所需要的數(shù)據(jù)。他能接受正則表達(dá)式和通配符。
礎(chǔ)實(shí)例:
1. 命令翻譯包含給定match_pattern的文本行,如我在grep.txt中查找PATTERN
grep PATTERN grep.txt
or grep "PATTERN" grep.txt
2. 匹配多個(gè)文件
grep PATTERN grep.txt grep1.txt
3. 從stdin中讀取
echo –e "this is a word\nnext line" | grep word
打?。簍his is a word
4. grep 與 正則表達(dá)式
grep –E "[a-z]+"
或者
egrep "[a-z]+"
5. 只輸出匹配部分,而不是匹配的當(dāng)前行
echo this is line. | greip –o –E "[a-z]+\."
輸出:line
6. 打印除包含match_pattern的行之外的所有行,可使用
grep -v match_pattern file
7. 統(tǒng)計(jì)文本或者文件中包含匹配字符串的字?jǐn)?shù)(這個(gè)面試經(jīng)常會(huì)問到)
$grep -c "text" filename
但他給出的是匹配行的次數(shù),而不是匹配的次數(shù)
統(tǒng)計(jì)匹配數(shù)量的話,可以用到下面的技巧
$echo –e "1 2 3 4\nhello\n5 6"| egrep -o "[0-9]" | wc –l
打印1到6 | 從stdin中讀取數(shù)字,分行打印 | 統(tǒng)計(jì)行數(shù)
8. 打印行號(hào)
grep "text" -n filename
9. 搜2個(gè)文件,以及他們的行號(hào),輸出會(huì)打印文件名
grep "text"–n s1.txt s2.txt
10.如果你只想知道哪些文件有 單詞PATTERN
grep –l PATTER s1.txt s2.txt
-L則返回的不匹配文件列表
11.可以再整個(gè)目錄下查找 單詞PATTERN 在那些文件里
grep PATTERN . -R -n
12 同時(shí)多個(gè)匹配查找
echo this is a line of text | grep -e "this" -e "line" -o
打印:
this
line
13 只在某些合適的文件中搜索
grep "main()" .-r --include *.{c,cpp}
只在.c 和.cpp結(jié)尾的文件中搜索 main()
14 進(jìn)行搜索排除某些文件
grep "main()" . -r --exclude "README"
排除了所有文件名為"README"的文件
15 打印匹配之前或之后的3行
seq 10 | grep 5 –A 3 之前
seq 10 | grep 6 –B 3 之后
16 打印匹配前后3行,同時(shí)輸出
seq 10 | grep 5 –C 3
我們來看下--help
復(fù)制代碼 代碼如下:
用法: 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。
大多數(shù)功能已經(jīng)在實(shí)例中貼出,我的這個(gè)博文中,主要參考書籍《linux shell腳本攻略》
如果你覺得更是個(gè)學(xué)習(xí)時(shí)間比較充裕,不妨直接購買此書。
您可能感興趣的文章:- shift妙用之解決shell編程中的入?yún)栴}
- Bash Shell中Shift用法分享
- 詳解 Shell中的grep命令
- Shell編程中Shift的用法小結(jié)