Linux 文件搜索命令find,grep

find 命令

  1. 簡單示例:find . -type f -name "test"
    -type f 普通文件php

-type d 目錄
-type p 管道
-type l 符號連接
-name "文件名" 要搜索的文件名
還能夠用 -iname 進行大小寫無關的搜索node

  1. 搜索文件的結果做爲下一個命令的參數
    使用-exec參數,示例:linux

find . -type f -iname "*test*" -exec ls -l \{\} \;
*\{\} 是輸入參數的佔位符,哪裏須要放哪裏。這裏的轉義符在個人機器上無關緊要 {} 也能夠
\; 表示命令的結束*git

  1. 加上文件大小限制 -size
    find . -type f -name "*.c" -size +100k 搜索當前目錄下大於100KB的.C 文件正則表達式

find . -type f -name "*.c" -size -1000c 搜索當前目錄下小於1000字節的.C文件
find . -type f -name "*.c" -size 1000c 搜索當前目錄下等於1000字節的.C文件
搜索 -1k 無效的,應換爲 1024c
支持的單位:c 字節 w 字 k 千字節 M 兆字節 G 1G字節 b 512個字節塊,至關於一個扇區,單位是大小寫敏感的express

  1. 搜索最近修改的文件
    ctime 最近訪問, mtime 最近修改文件內容, atime最近修改文件的節點信息apache

ctime爲例, ctime n表示最近n天之前訪問的, ctime -n表示最近n天以內訪問的。
find . -type f -name "*.c" -ctime +1 修改一天之前訪問的 .C 文件
*ctime 包括了 mtime, 同時還包括了文件權限、文件所屬用戶等基本信息的修改
他們的區別參見 Difference between mtime, ctime and atime*
還可使用 cmin mmin amin 將時間粒度縮小到分鐘segmentfault

  1. 搜索指定用戶的文件
    find / -user syslog 搜索屬於 syslog用戶的文件。svn

find / -group shadow 搜搜用戶組shadow的文件
find / -perm 644 搜索644權限的文件
find / -perm -644 搜索包含 644權限的文件,例如744.net

find 命令是遞歸搜索目錄的, 能夠經過 -maxdepth num 指定遞歸的深度,該參數建議放在緊跟目錄路徑後的位置,否則會有一條警告。

grep 根據文件的內容進行搜索

基本示例:搜索某個文件中包含關鍵字: grep 'keyword' filename 多個文件空格分開

經常使用參數說明

選擇正則匹配的模式:
  • -E 擴展正則模式,等價於 egrep

  • -F 字符串,不使用正則匹配 ,等價於fgrep

  • -P perl的正則風格(PCRE)

  • -G 基本正則模式
    -E-G主要區別在於, 基本模式下 ?, +, {, |, (, )這些元字符是失效的,做爲普通字符解釋。須要在基本模式中使用元字符請加轉義符\。例如我要匹配當前目錄下文本中包含{{{, 須要寫成grep -R '{\{3\}' ./* 或者 grep -ER '{{3}' ./*

建議將正則部分始終放在單引號中,例如想匹配 PHP 或 apache應寫成 egrep php \|apacheegrep 'php|apache'不然 | 在Linux 命令行下會被看成一個管道符號
grep,egrep,fgrep的區別請戳我

影響匹配的其餘參數
  • -i 忽略大小寫

  • -w 單詞匹配

  • -v 顯示不匹配的行

  • -f 使用保存在文件中的正則表達式作匹配
    egrep -f pattern.txt a.txt b.txt

使用pattern.txt的正則匹配,pattern.txt 內容爲 [[:digit:]]{9} ,匹配結果爲
a.txt:123456
b.txt:234575
保存正則表達式的文件, 默認一行一個正則,搜索中會將匹配全部正則的結果輸出

  • -x 搜索的文件須要一整行匹配正則表達式
    例如將上例中的 a.txt第一行內容123456 修改成 123456 789, 執行以下命令

egrep -xf pattern.txt a.txt b.txt, 匹配結果爲
b.txt:234575 
由於修改後a.txt的內容,再也不一整行都知足正則,也能夠理解爲正則加了行首行尾的位置匹配: ^expression$

影響匹配結果顯示的參數
  • -c 顯示匹配的行數,不顯示匹配的具體內容

  • -L 只顯示沒有匹配的文件名

  • -l 只顯示匹配的文件名

  • -m num 限制匹配的次數,最大爲num個
    egrep -m 1 -f pattern.txt a.txt b.txt 這樣一條指令,只會在每一個文件中匹配 1 次,便開始搜索下一個文件

  • -o only matching,只顯示匹配一行中匹配到的內容。 grep 默認是將能包含匹配內容所在行輸出,使用-o則只打印匹配的部分

  • -n 顯示匹配行在所匹配文件中行數。

  • -h 不顯示匹配的結果中的文件名列

影響文件、目錄搜索方式的參數
  • -r or -R 遞歸的搜索目錄, 很經常使用
    區別在於-R 會搜索符號連接指向的文件或目錄; -r 則不會,除非該符號連接在參數中顯示指定了一個符號連接,例如

egrep -rn '[[:digit:]]' ./ ./.local/share/systemd/user,該命令在當前目錄下搜索, 還包括了一個符號連接

  • --exclude=GLOB 跳過文件名匹配'GLOB'的文件,例如在版本庫中搜索時
    egrep --exclude=*.svn -rnf pattern.txt ./ 排除版本庫的文件

GLOB 中可使用 , ?, []*

  • --include=GLOB 僅在文件名匹配'GLOB'的文件中搜索

示例

排除多個目錄進行搜索
grep -rn --color --exclude-dir={node_modules,scripts,tests} "console.log" ./*

mac 下替換多個文件內容
grep -rl '10.0.2.118' ./*.js | xargs sed -i -e "s/abc/def/g"

mac 下替換 \t 爲空格
find . -type f -name "*.js" -exec sed -i '' "s/$(printf '\t')/ /g" \{\} \;

linux 下查找大文件 
find /var/logs/ -type f -size +1000000k -exec ls -lh {} \;

參考

  1. How to run grep with multiple AND patterns?

相關文章
相關標籤/搜索