一、whereis指令
該指令會在特定目錄中查找符合條件的檔案。這些檔案應屬于原始代碼、二進制檔案,或是幫助檔案。
該指令隻能用于查找二進制檔案、源代碼檔案和man手冊頁,一般檔案的定位需使用locate指令。
簡單了解:隻能搜尋系統指令,不能搜尋普通檔案。
文法:whereis [-bfmsu][-B <目錄>...][-M <目錄>...][-S <目錄>...][檔案...]
參數:
- -b 隻查找二進制檔案。
- -B<目錄> 隻在設定的目錄下查找二進制檔案。
- -f 不顯示檔案名前的路徑名稱。
- -m 隻查找說明檔案。
- -M<目錄> 隻在設定的目錄下查找說明檔案。
- -s 隻查找原始代碼檔案。
- -S<目錄> 隻在設定的目錄下查找原始代碼檔案。
- -u 查找不包含指定類型的檔案。
執行個體:
[[email protected] ~]# whereis bash
bash: /usr/bin/bash /usr/share/man/man1/bash.1.gz
注意:以上輸出資訊從左至右分别為:查詢的程式名、bash路徑、bash的man手冊頁路徑。
二、which 指令
該指令會在環境變量$PATH指定的路徑中,搜尋某個系統指令的位置,并且傳回第一個搜尋結果。也就是說,使用which指令,就可以看到某個系統指令是否存在,以及執行的到底是哪一個位置的指令。
文法:which [檔案...]
參數:
- -n<檔案名長度> 指定檔案名長度,指定的長度必須大于或等于所有檔案中最長的檔案名。
- -p<檔案名長度> 與-n參數相同,但此處的<檔案名長度>包括了檔案的路徑。
- -w 指定輸出時欄位的寬度。
- -V 顯示版本資訊。
執行個體:
ll:[[email protected] ~]# whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz
[[email protected] ~]# which ls
alias ls='ls --color=auto'
/usr/bin/ls
[[email protected] ~]# which ll
alias ll='ls -l --color=auto'
/usr/bin/ls
注意:which指令與whereis指令的差別在于他們的顯示結果不同:如果這個指令有别名,which指令則還可以顯示别名。
三、type指令
type指令 用來顯示指定指令的類型,判斷給出的指令是内部指令還是外部指令。
指令類型:
- alias:别名。
- keyword:關鍵字,Shell保留字。
- function:函數,Shell函數。
- builtin:内建指令,Shell内建指令。
- file:檔案,磁盤檔案,外部指令。
- unfound:沒有找到。
文法:type [選項] [參數]
選項
-t:輸出“file”、“alias”或者“builtin”,分别表示給定的指令為“外部指令”、“指令别名”或者“内部指令”;
-p:如果給出的指令為外部指令,則顯示其絕對路徑;
-f:隻傳回shell函數的資訊。
-a:在環境變量“PATH”指定的路徑中,顯示給定指令的資訊,包括指令别名。
參數: 指定指令-要顯示類型的指令指令。
執行個體:
[[email protected] ~]# type type
type 是 shell 内嵌
[[email protected] ~]# type -t ll
alias
[[email protected] ~]# type -t /bin/ls
file
[[email protected] ~]# type -p /bin/ls
/bin/ls
[[email protected] ~]# type -a /bin/ls
/bin/ls 是 /bin/ls
[[email protected] ~]# type -a ls
ls 是 `ls --color=auto' 的别名
ls 是 /usr/bin/ls
[[email protected] ~]# type -a find
find 是 /usr/bin/find
[[email protected] ~]# type -a grep
grep 是 `grep --color=auto' 的别名
grep 是 /usr/bin/grep
四、find指令
Linux find指令用來在指定目錄下查找檔案/目錄。任何位于參數之前的字元串都将被視為欲查找的目錄名。
如果使用該指令時,不設定任何參數,則find指令将在目前目錄下查找子目錄與檔案。并且将查找到的子目錄和檔案全部進行顯示。它提供了相當多的查找條件,功能很強大。但是,它是一個非常耗時,耗資源的指令,是以:
1)不能在系統繁忙時段運作;
2)盡可能在最小的搜尋範圍的前提下使用
文法
find path -option [ -print ] [ -exec -ok command ] {} \;
簡單了解為:
find [查找目錄] [查找規則] [查找完後的操作]
參數說明 :
find 根據下列規則判斷 path 和 expression,在指令列上第一個 - ( ) , ! 之前的部份為 path,之後的是 expression。如果 path 是空字串則使用目前路徑,如果 expression 是空字串則使用 -print 為預設 expression。
expression 中可使用的選項有二三十個之多,在此隻介紹最常用的部份。
-mount, -xdev : 隻檢查和指定目錄在同一個檔案系統下的檔案,避免列出其它檔案系統中的檔案
-amin n : 在過去 n 分鐘内被讀取過
-anewer file : 比檔案 file 更晚被讀取過的檔案
-atime n : 在過去n天内被讀取過的檔案
-cmin n : 在過去 n 分鐘内被修改過
-cnewer file :比檔案 file 更新的檔案
-ctime n : 在過去n天内被修改過的檔案
-empty : 空的檔案-gid n or -group name : gid 是 n 或是 group 名稱是 name
-ipath p, -path p : 路徑名稱符合 p 的檔案,ipath 會忽略大小寫
-name name, -iname name : 檔案名稱符合 name 的檔案。iname 會忽略大小寫
-size n : 檔案大小 是 n 機關,b 代表 512 位元組的區塊,c 表示字元數,k 表示 kilo bytes,w 是二個位元組。
-type c : 檔案類型是 c 的檔案。
d: 目錄
c: 字型裝置檔案
b: 區塊裝置檔案
p: 具名貯列
f: 一般檔案
l: 符号連結
s: socket
-pid n : process id 是 n 的檔案
你可以使用 ( ) 将運算式分隔,并使用下列運算。
exp1 -and exp2
! expr
-not expr
exp1 -or exp2
exp1, exp2
執行個體:推薦查詢規則加上引号
1)精準查找,将目前目錄及其下子目錄中的查找檔案列出
通過檔案名(-name):
[[email protected] ~]# tree
.
├── abc
│ ├── aa_dir
│ │ └── aa.txt
│ ├── bb_dir
│ │ └── bb.txt
│ ├── file2.cfg
│ ├── test22
│ │ ├── anaconda-ks.cfg
│ │ └── test_d
│ └── test.txt
└── anaconda-ks.cfg
5 directories, 6 files
[[email protected] ~]# find . -name aa.txt
./abc/aa_dir/aa.txt
所有者(-user):
[[email protected] ~]# ll ./abc
總用量 8
drwxr-xr-x 2 root root 20 1月 6 10:25 aa_dir
drwxr-x-wx 2 root root 20 1月 6 10:26 bb_dir
-rwxrw-r-- 1 lisi g_lisi 1440 12月 12 14:22 file2.cfg
drwxr-xr-- 3 root root 43 1月 4 14:08 test22
-rwxr-xr-- 1 root root 57 12月 12 14:37 test.txt
[[email protected] ~]# find ./abc -user 'lisi'
./abc/file2.cfg
[[email protected] ~]# find ./abc -user 'root'
./abc
./abc/test22
./abc/test22/anaconda-ks.cfg
./abc/test22/test_d
./abc/test.txt
./abc/bb_dir
./abc/bb_dir/bb.txt
./abc/aa_dir
./abc/aa_dir/aa.txt
所屬組(-group):
[[email protected] ~]# find ./abc -group "g_lisi"
./abc/file2.cfg
2)模糊查找
通配符: * 表示任意字元, ?表示一個字元
iname 會忽略大小寫
[[email protected] ~]# find . -name "*_*"
./.bash_logout
./.bash_profile
./.bash_history
./abc/test22/test_d
./abc/bb_dir
./abc/aa_dir
[[email protected] ~]# find . -name "*_???"
./abc/bb_dir
./abc/aa_dir
3)查找在/root/abc目錄下,在過去 1天讀取過的檔案
[[email protected] ~]# find /root/abc -atime -1
/root/abc
/root/abc/test22
/root/abc/test22/anaconda-ks.cfg
/root/abc/test22/test_d
/root/abc/file2.cfg
/root/abc/test.txt
/root/abc/bb_dir
/root/abc/bb_dir/bb.txt
/root/abc/aa_dir
/root/abc/aa_dir/aa.txt
4)多條件查詢:預設查找的内容指目錄和檔案
使用上面提到的 ( ) 将運算式分隔,-a(and),-o(or),!(not)
查找在/root/abc目錄下,條件: 過去 1天讀取過的檔案,檔案大小小于100M,一般檔案
[[email protected] ~]# find /root/abc -atime -1 -a -size -204800 -or -type f
/root/abc
/root/abc/test22
/root/abc/test22/anaconda-ks.cfg
/root/abc/test22/test_d
/root/abc/file2.cfg
/root/abc/test.txt
/root/abc/bb_dir
/root/abc/bb_dir/bb.txt
/root/abc/aa_dir
/root/abc/aa_dir/aa.txt
[[email protected] ~]# find /root/abc -atime -1 -a -size -204800 -and -type f
/root/abc/test22/anaconda-ks.cfg
/root/abc/bb_dir/bb.txt
/root/abc/aa_dir/aa.txt
5)查找完後的操作
查找在/root/abc目錄下,條件:字尾為 .txt的一般檔案
注意:-exec可以替換-ok,功能一樣隻是多一個提示
操作1:找到,ls -l 列出
[[email protected] ~]# find /root/abc -name "*.txt" -exec ls -l {} \;
-rwxr-xr-- 1 root root 57 12月 12 14:37 /root/abc/test.txt
-rw-r---w- 1 root root 0 1月 5 13:46 /root/abc/bb_dir/bb.txt
-rw-r--r-- 1 root root 0 1月 5 13:25 /root/abc/aa_dir/aa.txt
[[email protected] ~]# find /root/abc -name "*.txt" -ok ls -l {} \;
< ls ... /root/abc/test.txt > ? y
-rwxr-xr-- 1 root root 57 12月 12 14:37 /root/abc/test.txt
< ls ... /root/abc/bb_dir/bb.txt > ? y
-rw-r---w- 1 root root 0 1月 5 13:46 /root/abc/bb_dir/bb.txt
< ls ... /root/abc/aa_dir/aa.txt > ? y
-rw-r--r-- 1 root root 0 1月 5 13:25 /root/abc/aa_dir/aa.txt
操作2:删除,并在删除之前不詢問
[[email protected] ~]# find /root/abc -name "*.txt" -exec rm -rf {} \;
[[email protected] ~]# tree
.
├── abc
│ ├── aa_dir
│ ├── bb_dir
│ ├── file2.cfg
│ └── test22
│ ├── anaconda-ks.cfg
│ └── test_d
└── anaconda-ks.cfg
5 directories, 3 files
四、grep指令
grep 指令用于查找檔案裡符合條件的字元串。是一種強大的文本搜尋工具。grep可用于shell腳本。
grep 指令用于查找内容包含指定的範本樣式的檔案,如果發現某檔案的内容符合所指定的範本樣式,預設 grep 指令會把含有範本樣式的那一列顯示出來。若不指定任何檔案名稱,或是所給予的檔案名為 -,則 grep 指令會從标準輸入裝置讀取資料。不影響原檔案内容。
grep指令和find指令的主要差別:find是搜尋檔案/目錄本身;而grep指令是搜尋在檔案裡邊的内容
文法
grep [-abcEFGhHilLnqrsvVwxy][-A<顯示列數>][-B<顯示列數>][-C<顯示列數>][-d<進行動作>][-e<範本樣式>][-f<範本檔案>][--help][範本樣式][檔案或目錄...]
簡單了解為:
grep [選項] [模式] [檔案]
參數:
- -a 或 --text : 不要忽略二進制的資料。
- -A<顯示行數> 或 --after-context=<顯示行數> : 除了顯示符合範本樣式的那一列之外,并顯示該行之後的内容。
- -b 或 --byte-offset : 在顯示符合樣式的那一行之前,标示出該行第一個字元的編号。
- -B<顯示行數> 或 --before-context=<顯示行數> : 除了顯示符合樣式的那一行之外,并顯示該行之前的内容。
- -c 或 --count : 計算符合樣式的列數。
- -C<顯示行數> 或 --context=<顯示行數>或-<顯示行數> : 除了顯示符合樣式的那一行之外,并顯示該行之前後的内容。
- -d <動作> 或 --directories=<動作> : 當指定要查找的是目錄而非檔案時,必須使用這項參數,否則grep指令将回報資訊并停止動作。
- -e<範本樣式> 或 --regexp=<範本樣式> : 指定字元串做為查找檔案内容的樣式。
- -E 或 --extended-regexp : 将樣式為延伸的正規表達式來使用。
- -f<規則檔案> 或 --file=<規則檔案> : 指定規則檔案,其内容含有一個或多個規則樣式,讓grep查找符合規則條件的檔案内容,格式為每行一個規則樣式。
- -F 或 --fixed-regexp : 将樣式視為固定字元串的清單。
- -G 或 --basic-regexp : 将樣式視為普通的表示法來使用。
- -h 或 --no-filename : 在顯示符合樣式的那一行之前,不标示該行所屬的檔案名稱。
- -H 或 --with-filename : 在顯示符合樣式的那一行之前,表示該行所屬的檔案名稱。
- -i 或 --ignore-case : 忽略字元大小寫的差别。
- -l 或 --file-with-matches : 列出檔案内容符合指定的樣式的檔案名稱。
- -L 或 --files-without-match : 列出檔案内容不符合指定的樣式的檔案名稱。
- -n 或 --line-number : 在顯示符合樣式的那一行之前,标示出該行的列數編号。
- -o 或 --only-matching : 隻顯示比對PATTERN 部分。
- -q 或 --quiet或--silent : 不顯示任何資訊。
- -r 或 --recursive : 此參數的效果和指定"-d recurse"參數相同。
- -s 或 --no-messages : 不顯示錯誤資訊。
- -v 或 --revert-match : 顯示不包含比對文本的所有行。取反
- -V 或 --version : 顯示版本資訊。
- -w 或 --word-regexp : 隻顯示全字元合的列。即隻能是單詞,而不能是單詞中的某一部分
- -x --line-regexp : 隻顯示全列符合的列。
- -y : 此參數的效果和指定"-i"參數相同。
- –help : 線上幫助。
1)基本使用方式
-i 忽略大小寫
[[email protected] ~]# grep -i "keyboard" ./abc/file2.cfg
# Keyboard layouts
keyboard --vckeymap=cn --xlayouts='cn'
-c 顯示行号
-cv 顯示有幾行沒被比對到

注意:
顯示的行号,不是給結果編一個新的行号,是源檔案中的行号
如果同時使用-cv選項是顯示有多少行沒有被比對到。
-o 隻顯示與搜尋比對到的内容
[[email protected] ~]# grep -o "boot" ./abc/file2.cfg
boot
boot
boot
boot
boot
boot
boot
-A -B -C 使用
[[email protected] ~]# grep -n -A 2 "location" ./abc/file2.cfg
27:bootloader --location=mbr --boot-drive=sda
28-# Partition clearing information
29-clearpart --none --initlabel
模式部分:
1、直接輸入要比對的字元串,這個使用加-f選項(grep -f),或者直接使用 fgrep指令(fast grep)代替來提高查找速度
2、使用基本正規表達式 : 特殊字元要用轉義符\
\b或\<:錨定單詞的詞首
\b或\>:錨定單詞的詞尾
\B :與\b作用相反。
分組及引用:
分組:比對的是重複的abc這一個整個字元時,我們就需要分組,将abc作為一個整體
後向引用:表示在引用整個正則中分組中所比對到的結果,\1表示第一個分組中的正則所比對到的結果。如果是嵌套分組,分組順序取決于分組符号的左側部分部分的順序。
\(string\) :将string作為一個整體友善後面引用
\1 :引用第1個左括号及其對應的右括号所比對的内容。
\2 :引用第2個左括号及其對應的右括号所比對的内容。
\n :引用第n個左括号及其對應的右括号所比對的内容。
執行個體:
1)标點符号
2)搜尋/etc/passwd檔案中以/開始,以sh結尾的字元串,在/和sh中間可以有0-2個任意字元
[[email protected] ~]# grep "/.\{0,2\}sh$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
lisi:x:1000:1000::/home/lisi:/bin/bash
3)分組:\ 為轉義符
[[email protected] ~]# grep "\(114\.\)\{3\}" ./abc/file2.cfg
network --bootproto=dhcp --device=ens33 --nameserver=114.114.114.114,218.108.248.200,218.108.248.228 --ipv6=auto --activate
3、擴充的(Extend)正規表達式
使用擴充的正規表達式要加-E選項(grep -E),或者直接使用 egrep指令,基本不需要加轉義符\
在網絡配置檔案 /etc/sysconfig/network-scripts/ifcfg-ens33 中檢索出所有的 IP
[[email protected] ~]# egrep "(\b[1-9][0-9]{0,2}\.){3}\b[1-9][0-9]{0,2}" /etc/sysconfig/network-scripts/ifcfg-ens33
注意:
- 預設情況下,正規表達式的比對工作在貪婪模式下,也就是說它會盡可能長地去比對,比如某一行有字元串 abacb,如果搜尋内容為 "a.*b" 那麼會直接比對 abacb這個串,而不會隻比對ab或acb。
- 所有的正則字元,如 [ 、* 、( 等,若要搜尋 * ,而不是想把 * 解釋為重複先前字元任意次,可以使用 \* 來轉義。
五、locate指令
1、指令簡介
locate(locate) 指令用來查找檔案或目錄。 locate指令要比find -name快得多,原因在于它不搜尋具體目錄,而是搜尋一個資料庫/var/lib/mlocate/mlocate.db 。這個資料庫中含有本地所有檔案資訊。Linux系統自動建立這個資料庫,并且每天自動更新一次,是以,我們在用whereis和locate 查找檔案時,有時會找到已經被删除的資料,或者剛剛建立檔案,卻無法查找到,原因就是因為資料庫檔案沒有被更新。為了避免這種情況,可以在使用locate之前,先使用updatedb指令,手動更新資料庫。
整個locate工作其實是由四部分組成的:
/usr/bin/updatedb 主要用來更新資料庫,通過crontab自動完成的
/usr/bin/locate 查詢檔案位置
/etc/updatedb.conf updatedb的配置檔案
/var/lib/mlocate/mlocate.db 存放檔案資訊的檔案
文法:locate [選項] [參數]
選項:
-b --basename 與--wholename相反,認為後接的字元串是basename來進行比對
-c --count 不列出比對的檔案名,隻列出數量
-d --database DBPATH 後接指定資料庫變量DBPATH,該變量是一串資料庫名的清單,不采用預設比對資料庫mlocatedb
-e --existing 隻顯示目前存在的檔案條目
-L --follow 檢查檔案是否存在時,會通過符号連結找到被連結檔案,這樣就不會輸出broken symbolic的結果(當符号連結指向的檔案被删除時,該符号連結成為broken symbolic),預設設定,與-P相對
-i --ignore-case 比對時忽略大小寫(預設是區分大小寫)
-l --limit 實際使用時的用法為locate -n 數字,表示隻列出前幾個比對結果
-m --mmap 忽略向後相容性,一般用不上
-P --nofollow,-H 與-L相對,不沿符号連結檢查檔案是否存在,會将broken symbolic結果也輸出
-0 -null 将輸出裡的不同條目以ASCII字元NUL進行間隔,其實就是輸出結果連在一起不換行
-S --statistics 後面不接參數,隻是把搜尋資料庫的統計資訊輸出
-q --quiet 靜默模式,不顯示讀取資料庫的錯誤資訊
-r --regexp REGEXP 使用基礎正規表達式
--regex 使用擴充正規表達式
-s --stdio 忽略向後相容性,一般用不上
-V --version
-w --wholename 與--basename相對,将後接字元串作為whole path name進行比對,這樣轉義符号無法被識别
參數:要查找的檔案名中含有的字元串
CentOS7預設沒有安裝該指令,先安裝,然後更新背景資料庫,輸入指令:updatedb,最後就可以使用了
[[email protected] ~]# rpm -qa mlocate <=查詢mlocate指令是否安裝。如果沒有顯示就執行下面的指令
[[email protected] ~]# yum -y install mlocate
[[email protected] ~]# updatedb
[[email protected] ~]# locate /etc/my
/etc/my.cnf
/etc/my.cnf.d
/etc/my.cnf.d/mysql-clients.cnf
2、執行個體:新增的檔案無法locate時,使用updatedb
1)查找所有名字包含_dir的檔案
[[email protected] ~]# locate _dir
/root/abc/aa_dir
/root/abc/bb_dir
/root/abc/aa_dir/aa.txt
/usr/lib/dracut/modules.d/99microcode_ctl-fw_dir_override
/usr/lib/dracut/modules.d/99microcode_ctl-fw_dir_override/module-setup.sh
/usr/lib/python2.7/site-packages/firewall/core/fw_direct.py
/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyc
/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyo
/usr/lib64/httpd/modules/mod_dir.so
2)列出5個字尾為.sh的檔案
[[email protected] ~]# locate -l 5 .sh
/boot/grub2/i386-pc/modinfo.sh
/etc/dhcp/dhclient-exit-hooks.d/azure-cloud.sh
/etc/dhcp/dhclient.d/chrony.sh
/etc/kernel/postinst.d/51-dracut-rescue-postinst.sh
/etc/profile.d/256term.sh
3)使用正規表達式查找
[[email protected] ~]# locate -r "/[a-zA-Z]\{0,2\}_dir$"
/root/abc/aa_dir
/root/abc/bb_dir
4)檢視updatedb的配置檔案 /etc/updatedb.conf
[[email protected] ~]# cat /etc/updatedb.conf
PRUNE_BIND_MOUNTS = "yes"
PRUNEFS = "9p afs anon_inodefs auto autofs bdev binfmt_misc cgroup cifs coda configfs cpuset debugfs devpts ecryptfs exofs fuse fuse.sshfs fusectl gfs gfs2 gpfs hugetlbfs inotifyfs iso9660 jffs2 lustre mqueue ncpfs nfs nfs4 nfsd pipefs proc ramfs rootfs rpc_pipefs securityfs selinuxfs sfs sockfs sysfs tmpfs ubifs udf usbfs fuse.glusterfs ceph fuse.ceph"
PRUNENAMES = ".git .hg .svn"
PRUNEPATHS = "/afs /media /mnt /net /sfs /tmp /udev /var/cache/ccache /var/lib/yum/yumdb /var/spool/cups /var/spool/squid /var/tmp /var/lib/ceph"
第一行PRUNE_BIND_MOUNTS="yes"的意思是:是否進行限制搜尋。
第二行是排除檢索的檔案系統類型,即列出的檔案系統類型不進行檢索。
第二行表示對哪些字尾的檔案排除檢索,也就是列在這裡面的字尾的檔案跳過不進行檢索。不同字尾之間用空格隔開。
第四行是排除檢索的路徑,即列出的路徑下的檔案和子檔案夾均跳過不進行檢索。
看這個檔案的目的:
updatedb之後使用locate仍然找不到想要檔案,檢視檢查挂載的目錄是否被忽略了,如果需要搜尋挂在的目錄,自己開啟即可。
參考文章:
linux中grep指令的用法
Shell正規表達式
站在前輩的肩膀上,每天進步一點點
ends~