從這篇開始,是常值內容操作,區別於文本操作。
Linux系統中grep命令是一種強大的文本搜尋工具,它能使用Regex搜尋文本,並把匹 配的行列印出來。grep全稱是Global Regular Expression Print,表示全域Regex版本,它的使用許可權是所有使用者。
shell,perl,python,一直都是文本操作的專家語言,而我們今後學習的的將是shell的噱頭--文本操作。下面提到最常見的一個:
grep
這算是常值內容的一個重量級選手,能根據某些規格在上千行的文字檔中尋找所需要的資料。他能接受Regex和萬用字元。
礎執行個體:
1. 命令翻譯包含給定match_pattern的文本行,如我在grep.txt中尋找PATTERN
grep PATTERN grep.txt
or grep "PATTERN" grep.txt
2. 匹配多個檔案
grep PATTERN grep.txt grep1.txt
3. 從stdin中讀取
echo –e "this is a word\nnext line" | grep word
列印:this is a word
4. grep 與 Regex
grep –E "[a-z]+"
或者
egrep "[a-z]+"
5. 只輸出匹配部分,而不是匹配的當前行
echo this is line. | greip –o –E "[a-z]+\."
輸出:line
6. 列印除包含match_pattern的行之外的所有行,可使用
grep -v match_pattern file
7. 統計文本或者檔案中包含匹配字串的字數(這個面試經常會問到)
$grep -c "text" filename
但他給出的是匹配行的次數,而不是匹配的次數
統計匹配數量的話,可以用到下面的技巧
$echo –e "1 2 3 4\nhello\n5 6"| egrep -o "[0-9]" | wc –l
列印1到6 | 從stdin中讀取數字,分行列印 | 統計行數
8. 列印行號
grep "text" -n filename
9. 搜2個檔案,以及他們的行號,輸出會列印檔案名
grep "text"–n s1.txt s2.txt
10.如果你只想知道哪些檔案有 單詞PATTERN
grep –l PATTER s1.txt s2.txt
-L則返回的不匹配檔案清單
11.可以再整個目錄下尋找 單詞PATTERN 在那些檔案裡
grep PATTERN . -R -n
12 同時多個匹配尋找
echo this is a line of text | grep -e "this" -e "line" -o
列印:
this
line
13 只在某些合適的檔案中搜尋
grep "main()" .-r --include *.{c,cpp}
只在.c 和.cpp結尾的檔案中搜尋 main()
14 進行搜尋排除某些檔案
grep "main()" . -r --exclude "README"
排除了所有檔案名稱為"README"的檔案
15 列印匹配之前或之後的3行
seq 10 | grep 5 –A 3 之前
seq 10 | grep 6 –B 3 之後
16 列印匹配前後3行,同時輸出
seq 10 | grep 5 –C 3
我們來看下--help
複製代碼 代碼如下:
用法: grep [選項]... PATTERN [FILE]...
在每個 FILE 或是標準輸入中尋找 PATTERN。
預設的 PATTERN 是一個基本Regex(縮寫為 BRE)。
例如: grep -i 'hello world' menu.h main.c
Regex選擇與解釋:
-E, --extended-regexp PATTERN 是一個可擴充的Regex(縮寫為 ERE)
-F, --fixed-strings PATTERN 是一組由斷行符分隔的定長字串。
-G, --basic-regexp PATTERN 是一個基本Regex(縮寫為 BRE)
-P, --perl-regexp PATTERN 是一個 Perl Regex
-e, --regexp=PATTERN 用 PATTERN 來進行匹配操作
-f, --file=FILE 從 FILE 中取得 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 檔案最後列印Null 字元
檔案控制:
-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。
大多數功能已經在執行個體中貼出,我的這個博文中,主要參考書籍《linux shell指令碼攻略》
如果你覺得更是個學習時間比較充裕,不妨直接購買此書。