grep——高逼格 Linux文字搜尋神器

weixin_34365417發表於2018-04-18

一句話,如果你只記得某個檔案中的幾個詞,怎麼鎖定字串所在的目錄。

用軟體就 low 了,我們們用 mac 蘋果電腦的主當然是直接敲命令列顯逼格了,不用怕是灰常簡單實用的命令列。

grep 命令--簡單、好用、顯逼格

如果想根據檔名查詢檔案路徑,可以看我的這篇文章
find—— 高逼格Linux\Mac檔案目錄查詢神器,搭配使用效果更佳。

// 終端:當前目錄下的所有檔案,包含“你好”字串的檔案有多少、目錄在哪、在這個檔案的哪一行?

grep -rne "你好" .

What

grep是什麼鬼?

grep(Globally search a Regular Expression and Print):一種強大的文字搜尋工具,它能使用特定模式匹配(包括正規表示式)搜尋文字,並預設輸出匹配行

關於 grep 的詳細細節可以檢視 grep 的官方文件

When

我們都知道在 lunix 系統中“一切皆檔案”,那麼在終端偌大的磁碟數不清的檔案中,你想要的檔案究竟在哪呢?

grep:
根據檔案中文字行(部分或完整)查詢相應檔案

Know-how

總體命令格式

grep [選項]  [模式]  [input_file_names]
命令 引數 作用
-a -- 不要忽略二進位制資料
-A <顯示列數> 除了顯示符合範本樣式的那一行之外,並顯示該行後的內容
-b -- 在顯示符合範本樣式的那一行之外,並顯示該行之前的內容
-c -- 計算符合範本樣式的列數
-C <顯示列數>或-<顯示列數> 除了顯示符合範本樣式的那一列之外,並顯示該列之前後的內容
-d <進行動作> 當指定要查詢的是目錄而非檔案時,必須使用這項引數,否則grep命令將回報資訊並停止動作
-e <範本樣式> 指定字串作為查詢檔案內容的範本樣式
-E --- 將範本樣式為延伸的普通表示法來使用,意味著使用能使用擴充套件正規表示式
-f <範本檔案> 指定範本檔案,其內容有一個或多個範本樣式,讓grep查詢符合範本條件的檔案內容,格式為每一列的範本樣式
-F --- 將範本樣式視為固定字串的列表
-G --- 將範本樣式視為普通的表示法來使用
-h --- 在顯示符合範本樣式的那一列之前,不標示該列所屬的檔名稱
-H --- 在顯示符合範本樣式的那一列之前,標示該列的檔名稱
-i -- 忽略字元大小寫的差別
-l -- 列出檔案內容符合指定的範本樣式的檔名稱
-L -- 列出檔案內容不符合指定的範本樣式的檔名稱
-n -- 在顯示符合範本樣式的那一列之前,標示出該列的編號
-q -- 不顯示任何資訊
-R/-r -- 此引數的效果和指定“-d recurse”引數相同
-s -- 不顯示錯誤資訊
-v -- 反轉查詢
-w -- 只顯示全字元合的列
-x -- 只顯示全列符合的列
-y -- 此引數效果跟“-i”相同
-o -- 只輸出檔案中匹配到的部分

1、命令列選項

  • 基本資訊
  • 匹配控制
  • 輸出控制
  • 輸出路徑字首
  • 上下文行控制
  • 檔案目錄選擇
1.1、 基本資訊命令

幫助

--help

版本資訊

-V   
--version
bogon:Desktop guoxiangyang$ grep --version
grep (BSD grep) 2.5.1-FreeBSD
1.2、 匹配控制
  • 指定字串作為匹配文字,查詢文字在檔案中的位置
grep -e <pattern>
--regexp=pattern

查詢README.md檔案中“collection”字串

bogon:YYKit guoxiangyang$ grep -e "collection" README.md
YYKit is a collection of iOS components.
  • 範本樣式為固定字串
grep -F
bogon:YYKit guoxiangyang$ grep -F collecti  README.md README1.md
README.md:YYKit is a collection of iOS components.
  • 以檔案為單位,多個檔案進行匹配查詢
    事先將要搜尋的樣式寫入到一個檔案,一行一個樣式。然後採用檔案搜尋。 空的檔案表示沒有要搜尋的樣式,因此也就不會有任何符合。
// newfile為搜尋樣式檔案
grep -f <newfile>  <file>
  • 查詢時忽略字元大小寫
-i
-y
--ignore-case
  • 反轉查詢
-v
--invert-match
  • 只顯示全字元符合的列
-w
--word-regexp
  • 只顯示全列符合的列
-x
--line-regexp
1.3、 基本輸出控制
  • 輸出數字,統計匹配樣本的行數
-c
-count

bogon:YYKit guoxiangyang$ grep -c "CocoaPods" README.md
6
  • 給輸出的匹配文字加顏色
--color

grep --color=auto 
  • 列出檔案內容符合匹配文字的檔名稱
-l
--files-with-matches

grep -l <pattern> file1 file2 ...
  • 列出檔案內容不符合匹配文字的檔名稱
-L
--files-without-match

grep -L <pattern> file1 file2 ...
  • 只輸出檔案中匹配到的部分
-o
--only-matching

bogon:YYKit guoxiangyang$ grep  "CocoaPods" -o  README.md README1.md
README.md:CocoaPods
README.md:CocoaPods
1.4、 輸出字首控制
  • 當要輸出多個字首欄位時,不管這些選項的指定順序如何,順序始終是檔名:行號:位元組偏移量。
-b
--byte-offset

bogon:YYKit guoxiangyang$ grep  "CocoaPods" -b  README.md README1.md
README.md:2252:### CocoaPods
  • 在每行輸出前列印檔名,當有多個檔案時預設列印檔名
-H
--with-filename
  • 在每行輸出前加上匹配文字所在的行號
-n
--line-number
1.5、 上下文字行控制
  • 除了顯示符合範本樣式的那一行之外,並顯示該行之後的內容
-A <num>
--after-context=<num>

// 匹配"CocoaPods",並輸出之後的2行
grep  "CocoaPods" -A2  README.md README1.md
  • 在顯示符合範本樣式的那一行之外,並顯示該行之前的內容
-B <num>
--before-context=<num>
  • 在顯示符合範本樣式的那一行之外,並顯示該行之前、之後行的內容
-C <num>
-<num>
--context=<num>
1.6、 檔案和目錄選擇
  • 不要忽略二進位制檔案
-a
--text
  • 指定查詢範圍是目錄時必用
-d recurse
-R   --dereference-recursive
-r    --recursive

// 當前目錄下查詢匹配"CocoaPods",無需指定檔名
grep  "CocoaPods" -r  .

引用相關

grep 官方文件
grep命令
linux中的grep命令用法

相關文章