Linux常用命令 | grep

 
作者簡介
李先生(Lemon),高級運維工程師(自稱),SRE專家(目標),夢想在35歲買一輛保時捷。喜歡鑽研底層技術,認為底層基礎才是王道。一切新技術都離不開作業系統(CPU、記憶體、磁碟)、網路等。堅持輸入輸出,記錄自己學習的點滴,在平凡中堅持前行,總有一天會遇見不一樣的自己。公眾號:運維汪(ID:Leeeee_Li)。

 

一、前言

自己平時比較喜歡記筆記,工作四五年,筆記上千篇。最近離職了,加上職場瓶頸,準備好好復盤和整理一下相關的筆記、梳理一下知識點,可能後面有一系列的博文輸出,從基礎到進階。
 
 
 

二、什麼是Grep

Global Regular Expression Print 全局正則表達式
 
Grep是一個Linux / Unix命令行工具,用於在指定的文件中搜索字元串。文本搜索模式被稱為正則表達式。當它找到匹配項時,它將輸出帶有結果的行。在搜索大型日誌文件時,grep命令非常方便。
 
語法:
grep [options] pattern [files]
 

三、常用參數

-c: 只輸出匹配行的數目

-h: 列印出匹配的行,但是不顯示其文件名

-i: 不區分大小寫

-l: 查詢多文件的時候只輸出包含匹配字元的文件名

-n: 列印匹配行以及行號

-v: 反向匹配,即顯示不匹配的行

-w: 匹配整個單詞,而不是整個字元串

-b: 顯示匹配的位置

-o: 只顯示匹配的字串

-s: 不顯示錯誤資訊

-e exp:匹配多個

-E:使用正則匹配

 

四、實例

1:匹配項標記顏色

echo 「This is a word \n heihei」 |grep word --color=auto

 

2:把/etc/passwd包含root的取出來

grep root /etc/passwd      or     cat /etc/passwd |grep root 

 

3:把/etc/passwd不包含root的取出來
grep -v root /etc/passwd  or     cat /etc/passwd |grep -v root

 

4:demsg輸出的資訊中找出含eth的行,並且輸出行號,有顏色
dmesg | grep eth -n --color=auto

 

5:demsg輸出的資訊找出eth的行,並且找出含eth的前兩行和後三行
dmesg |grep eth -n -A3 -B2 --color=auto

 

grep退出的狀態

echo $?

# 0:表示成功
# 1:表示沒有匹配到
#
2:表示參數中的文件不存在

 

六、應用場景

1:匹配行的上下文
ifconfig | grep -C 3 "Link encap" 

 

-A n  後n行,A記憶為(After)
-B n  前n行,B記憶為(Before)
-C n  前n行,後n行,C記憶為(Center)
 
2:用-c統計數目
grep -c "baidu.com" file.txt

 

3:根據文件內容查找目錄
grep "declare"           當前目錄下查找
grep -r "declare"         當前目錄以及子目錄下查找
grep -r -l "declare"      查找只顯示文件名稱,不具體顯示的行
grep -R --exclude-dir="filename" baidu.com  除開某一個目錄不匹配

 

4、過濾掉注釋行
grep  ^[^#]  filename

      

5、過濾掉有空格的注釋行
grep "^\s*[^# \t].*$" filename

 

6、在file2中找出包含file1字元串的字元串
file1:                     
ddf                           
ddc                          
           
file2:
shinjldin
adcddf
ddf

 

grep -f file1 file2  

 
得到的結果:
adcddf
ddf
 
7、ps aux | grep init 與ps aux |grep [i]nit的區別
 
ps aux | grep init:

 

 

ps aux |grep [i]nit:
 
第一個init的時候她會把grep init也弄到進程里,所有可以匹配到init
第二個[i]nit的時候會把grep [i]nit 弄到進程里,但是[i]nit只能匹配init和nit,所有就只有一個
 
echo grep init |grep init
echo grep init |grep [i]nit
echo grep [i]nit |grep init
echo grep [i]nit |grep [i]nit

  

七、grep -E 與 grep 的區別

1、使用方法
grep -E 「^[a-zA-Z0-9]」 filename 
grep "^[a-zA-Z0-9]" filename 如果不加E的話,會匹配出錯

 

2、實例

下面兩個寫法都能達到同一個目的,使用-E與不使用-E的寫法

cat a.txt |grep -oE 'id=[0-9]{9,10}'
cat a.txt |grep -o 'id=[0-9]\{9,10\}'

 

八、學習交流

歡迎大家關注我的公眾號,一起交流、學習。