歡迎光臨
每天分享高質量文章

如何在 Linux shell 中找出所有包含指定文本的檔案

本文提供一些關於如何搜索出指定目錄或整個檔案系統中那些包含指定單詞或字串的檔案。
— Lubos Rendek


本文導航
編譯自 | https://linuxconfig.org/how-to-find-all-files-with-a-specific-text-using-linux-shell 
 作者 | Lubos Rendek
 譯者 | lujun9972

標的:本文提供一些關於如何搜索出指定目錄或整個檔案系統中那些包含指定單詞或字串的檔案。

難度:容易

約定:

◈ # – 需要使用 root 權限來執行指定命令,可以直接使用 root 用戶來執行也可以使用 sudo 命令
◈ $ – 可以使用普通用戶來執行指定命令

案例

非遞迴搜索包含指定字串的檔案

第一個例子讓我們來搜索 /etc/ 目錄下所有包含 stretch 字串的檔案,但不去搜索其中的子目錄:

  1. # grep -s stretch /etc/*

  2. /etc/os-release:PRETTY_NAME="Debian GNU/Linux 9 (stretch)"

  3. /etc/os-release:VERSION="9 (stretch)"

grep 的 -s 選項會在發現不存在或者不能讀取的檔案時隱藏報錯信息。結果顯示除了檔案名之外,還有包含請求字串的行也被一起輸出了。

遞迴地搜索包含指定字串的檔案

上面案例中忽略了所有的子目錄。所謂遞迴搜索就是指同時搜索所有的子目錄。

下麵的命令會在 /etc/ 及其子目錄中搜索包含 stretch 字串的檔案:

  1. # grep -R stretch /etc/*

  2. /etc/apt/sources.list:# deb cdrom:[Debian GNU/Linux testing _Stretch_ - Official Snapshot amd64 NETINST Binary-1 20170109-05:56]/ stretch main

  3. /etc/apt/sources.list:#deb cdrom:[Debian GNU/Linux testing _Stretch_ - Official Snapshot amd64 NETINST Binary-1 20170109-05:56]/ stretch main

  4. /etc/apt/sources.list:deb http://ftp.au.debian.org/debian/ stretch main

  5. /etc/apt/sources.list:deb-src http://ftp.au.debian.org/debian/ stretch main

  6. /etc/apt/sources.list:deb http://security.debian.org/debian-security stretch/updates main

  7. /etc/apt/sources.list:deb-src http://security.debian.org/debian-security stretch/updates main

  8. /etc/dictionaries-common/words:backstretch

  9. /etc/dictionaries-common/words:backstretch's

  10. /etc/dictionaries-common/words:backstretches

  11. /etc/dictionaries-common/words:homestretch

  12. /etc/dictionaries-common/words:homestretch's

  13. /etc/dictionaries-common/words:homestretches

  14. /etc/dictionaries-common/words:outstretch

  15. /etc/dictionaries-common/words:outstretched

  16. /etc/dictionaries-common/words:outstretches

  17. /etc/dictionaries-common/words:outstretching

  18. /etc/dictionaries-common/words:stretch

  19. /etc/dictionaries-common/words:stretch's

  20. /etc/dictionaries-common/words:stretched

  21. /etc/dictionaries-common/words:stretcher

  22. /etc/dictionaries-common/words:stretcher's

  23. /etc/dictionaries-common/words:stretchers

  24. /etc/dictionaries-common/words:stretches

  25. /etc/dictionaries-common/words:stretchier

  26. /etc/dictionaries-common/words:stretchiest

  27. /etc/dictionaries-common/words:stretching

  28. /etc/dictionaries-common/words:stretchy

  29. /etc/grub.d/00_essay-header:background_image -m stretch `make_system_path_relative_to_its_root "$GRUB_BACKGROUND"`

  30. /etc/os-release:PRETTY_NAME="Debian GNU/Linux 9 (stretch)"

  31. /etc/os-release:VERSION="9 (stretch)"

搜索所有包含特定單詞的檔案

上面 grep 命令的案例中列出的是所有包含字串 stretch 的檔案。也就是說包含 stretches , stretched 等內容的行也會被顯示。 使用 grep 的 -w 選項會只顯示包含特定單詞的行:

  1. # grep -Rw stretch /etc/*

  2. /etc/apt/sources.list:# deb cdrom:[Debian GNU/Linux testing _Stretch_ - Official Snapshot amd64 NETINST Binary-1 20170109-05:56]/ stretch main

  3. /etc/apt/sources.list:#deb cdrom:[Debian GNU/Linux testing _Stretch_ - Official Snapshot amd64 NETINST Binary-1 20170109-05:56]/ stretch main

  4. /etc/apt/sources.list:deb http://ftp.au.debian.org/debian/ stretch main

  5. /etc/apt/sources.list:deb-src http://ftp.au.debian.org/debian/ stretch main

  6. /etc/apt/sources.list:deb http://security.debian.org/debian-security stretch/updates main

  7. /etc/apt/sources.list:deb-src http://security.debian.org/debian-security stretch/updates main

  8. /etc/dictionaries-common/words:stretch

  9. /etc/dictionaries-common/words:stretch's

  10. /etc/grub.d/00_essay-header:background_image -m stretch `make_system_path_relative_to_its_root "$GRUB_BACKGROUND"`

  11. /etc/os-release:PRETTY_NAME="Debian GNU/Linux 9 (stretch)"

  12. /etc/os-release:VERSION="9 (stretch)"

顯示包含特定文本的檔案名

上面的命令都會產生多餘的輸出。下一個案例則會遞迴地搜索 etc 目錄中包含 stretch的檔案並只輸出檔案名:

  1. # grep -Rl stretch /etc/*

  2. /etc/apt/sources.list

  3. /etc/dictionaries-common/words

  4. /etc/grub.d/00_essay-header

  5. /etc/os-release

大小寫不敏感的搜索

預設情況下搜索是大小寫敏感的,也就是說當搜索字串 stretch 時只會包含大小寫一致內容的檔案。

通過使用 grep 的 -i 選項,grep 命令還會列出所有包含 Stretch , STRETCH, StReTcH 等內容的檔案,也就是說進行的是大小寫不敏感的搜索。

  1. # grep -Ril stretch /etc/*

  2. /etc/apt/sources.list

  3. /etc/dictionaries-common/default.hash

  4. /etc/dictionaries-common/words

  5. /etc/grub.d/00_essay-header

  6. /etc/os-release

搜索時包含/排除指定檔案

grep 命令也可以只在指定檔案中進行搜索。比如,我們可以只在配置檔案(擴展名為.conf)中搜索指定的文本/字串。 下麵這個例子就會在 /etc 目錄中搜索帶字串 bash 且所有擴展名為 .conf 的檔案:

  1. # grep -Ril bash /etc/*.conf

  2. OR

  3. # grep -Ril --include=\*.conf bash /etc/*

  4. /etc/adduser.conf

類似的,也可以使用 --exclude 來排除特定的檔案:

  1. # grep -Ril --exclude=\*.conf bash /etc/*

  2. /etc/alternatives/view

  3. /etc/alternatives/vim

  4. /etc/alternatives/vi

  5. /etc/alternatives/vimdiff

  6. /etc/alternatives/rvim

  7. /etc/alternatives/ex

  8. /etc/alternatives/rview

  9. /etc/bash.bashrc

  10. /etc/bash_completion.d/grub

  11. /etc/cron.daily/apt-compat

  12. /etc/cron.daily/exim4-base

  13. /etc/dictionaries-common/default.hash

  14. /etc/dictionaries-common/words

  15. /etc/inputrc

  16. /etc/passwd

  17. /etc/passwd-

  18. /etc/profile

  19. /etc/shells

  20. /etc/skel/.profile

  21. /etc/skel/.bashrc

  22. /etc/skel/.bash_logout

搜索時排除指定目錄

跟檔案一樣,grep 也能在搜索時排除指定目錄。 使用 --exclude-dir 選項就行。

下麵這個例子會搜索 /etc 目錄中搜有包含字串 stretch 的檔案,但不包括 /etc/grub.d 目錄下的檔案:

  1. # grep --exclude-dir=/etc/grub.d -Rwl stretch /etc/*

  2. /etc/apt/sources.list

  3. /etc/dictionaries-common/words

  4. /etc/os-release

顯示包含搜索字串的行號

-n 選項還會顯示指定字串所在行的行號:

  1. # grep -Rni bash /etc/*.conf

  2. /etc/adduser.conf:6:DSHELL=/bin/bash

尋找不包含指定字串的檔案

最後這個例子使用 -v 來列出所有包含指定字串的檔案。

例如下麵命令會搜索 /etc 目錄中不包含 stretch 的所有檔案:

  1. # grep -Rlv stretch /etc/*


via: https://linuxconfig.org/how-to-find-all-files-with-a-specific-text-using-linux-shell

作者:Lubos Rendek[2] 譯者:lujun9972 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

LCTT 譯者

lujun9972 ? ? ?
共計翻譯:24 篇
貢獻時間:21 天


推薦文章

< 左右滑動查看相關文章 >

點擊圖片、輸入文章 ID 或識別二維碼直達

赞(0)

分享創造快樂