在 linux 系統中,有三個強大的文本分析處理工具:grep sed awk,其中:
grep 用於搜索文本內容 => linux grep 命令常見用法
sed 用於編輯文本內容 => linux sed 命令常見用法
awk 用於處理和生成報表 => linux awk 命令常見用法
grep 的工作原理是將文件內容逐行讀入,然后在每一行數據中搜索符合條件的內容並打印出來
grep 命令的使用格式如下:
grep “pattern” file_name
在文件中搜索符合樣式 pattern 的內容,並打印出來
這里的 pattern 一般是正則表達式,也可以是字符串(字符串也可以看成是一種簡單的正則表達式)
下面結合實例簡單介紹 grep 命令的常見用法:
假設文件 log.txt 的內容如下:
running syntax check ... checked 100 lines,2 have errors error: nothing matched ! error: cannot open the target ! syntax check finished!
1. 搜索出包含字符 error 的行
grep error log.txt >> checked 100 lines,2 have errors error: nothing matched ! error: cannot open the target !
如果希望將搜索到的目標高亮出來,可以加上選項 “--color=auto”
grep --color=auto error log.txt >> checked 100 lines,2 have errors error: nothing matched ! error: cannot open the target !
為了方便,可以將這個選項添加到自己的 alias 文件中:
alias grep "grep --color=auto"
2. 搜索以 error 開頭的那些行
grep "^error" log.txt >> error: nothing matched ! error: cannot open the target !
這里的 "^error" 是正則表達式, 符號 "^" 表示一行的開頭
注意正則表達式需要用雙引號括起來,但是如果 pattern 是簡單的字符串(比如 “error”),則可以省略雙引號
3. 統計文件 log.txt 中字符 error 出現的次數
grep -c error log.txt >> 3
注意:如果一行中有多個 error 字符,只會統計一次
4. 搜索不包含字符串 error 的那些行
grep -v error log.txt >> running syntax check ... syntax check finished!
選項 “-v ” 表示 反轉搜索
5. 在目錄下的所有文件中搜索
grep -r error log
這里的 log 是一個目錄,表示在 目錄 log 和 log 的子目錄下的所有文件中搜索字符串 error
6. 搜索 “在文件 A 中存在,但是在文件 B 中不存在” 的那些行
文件 log1.txt 的內容如下:
data[1] data[2] data[3] data[4] data[5]
文件 log2.txt 中的內容是:
data[1] data[3] data[4]
假設需要搜索 “在文件 log1.txt 中存在,但是在 log2.txt 中不存在” 的那些行
grep -f log2.txt -vF log1.txt >> data[2] data[5]
這里的 -f 表示 “將文件的內容作為樣式”,也就是將文件中的每一行都作為樣式去搜索
而選項 -F 表示 “將樣式當作文本,而不是正則表達式”,默認情況下, grep 會將 log2.txt 中的每一行當作一個正則表達式,然后去 log1.txt 中查找是否有匹配這些正則表達式的內容,所以 "data[1]" 如果被視為正則表達式,就只能搜索到包含 “data1” 的那些行,因為正則表達式 “[1]" 就表示數字 1 ;
所以上面這條命令就表示: 將 log2.txt 中的每一行當做常規字符串,去 log1.txt 中搜索是否有有相同的字符串,如果有,就排除掉,最后打印出 log1.txt 中剩下的行。
方法2: cat log1.txt log2.txt | sort | uniq -u
其中 uniq -u 表示只打印那些不重復的行
grep 命令的用法還有很多,以上只是列舉了一些常見的用法,
如果希望深入學習,可以參考相關書籍或者直接訪問 GNU grep 網站:
http://www.gnu.org/software/grep/manual/grep.html
|--------------------------------------|
