目錄
1. 基本語法
1.1 字符類
字符 | 含義 | 舉例 |
. | 匹配任意一個字符 | abc.可以匹配 abcd、 abc9 等 |
[] | 匹配括號中的任意一個字符 | [abc]d 可以匹配 ad、 bd 或 cd |
- | 在[]括號內表示字符範圍 | [0-9a-fA-F]可以匹配一位十六進制數字 |
^ | 位於[]括號內的開頭,匹配除括號中的字符之外的任意一個字符 | [^xy]匹配除 xy 之外的任一字符,因此[^xy]1 可以匹配 a1、 b1 但不匹配 x1、 y1 |
[[:xxx:]] | grep 工具預定義的一些命名字符類 | [[:alpha:]]匹配一個字母, [[:digit:]]匹配一個數字 |
1.2 數量限定類
字符 | 含義 | 舉例 |
? | 緊跟在它前面的單元,應匹配零次或一次 | [0-9]?\.[0-9]匹配 0.0、 2.3、 .5 等,由於.在正則表達式中是一個特殊字符,所以需要用\轉義一下,取字面值 |
+ | 緊跟在它前面的單元,應匹配一次或多次 | [a-zA-Z0-9_.-]+@[a-zA-Z0-9_.-]+\.[a-zA-Z0- 9_.-]+匹配 email 地址 |
* | 緊跟在它前面的單元,應匹配零次或多次 | [0-9][0-9]*匹配至少一位數字,等價於[0-9]+, [azA-Z_]+[a-zA-Z_0-9]*匹配 C 語言的標識符 |
{N} | 緊跟在它前面的單元,應精確匹配 N 次 | [1-9][0-9]{2}匹配從 100 到 999 的整數 |
{N,} | 緊跟在它前面的單元,應匹配至少 N 次 | [1-9][0-9]{2,}匹配三位以上(含三位)的整數 |
{,M} | 緊跟在它前面的單元,應匹配最多 M 次 | [0-9]{,1}相當於[0-9]? |
{N,M} | 緊跟在它前面的單元應匹配至少 N 次,最多 M 次 | [0-9]{1,3}\.[0-9]{1,3}\.[0- 9]{1,3}\.[0-9]{1,3}匹配 IP 地址 |
2. grep
2.1 作用
Linux 系統中 grep 命令是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹 配
的行打印出來。 grep 全稱是 Global Regular Expression Print,表示全局正則表達式版本,它
的使用權限是所有用戶。
grep 家族包括 grep、 egrep 和 fgrep。 egrep 和 fgrep 的命令只跟 grep 有很小不同。 egrep 是
grep 的擴展,支持更多的 re 元字符, fgrep 就是 fixed grep 或 fast grep,它們把所有的字母都
看作單詞,也就是說,正則表達式中的元字符表示回其自身的字面意義,不再特殊。 linux 使用
GNU 版本的 grep。它功能更強,可以通過-G、 -E、 -F 命令行選項來使用 egrep 和 fgrep 的功
能。
2.2 格式
2.3 實例
1. grep ‘test’ d*
顯示所有以 d 開頭的文件中包含 test 的行。
2. grep ‘test’ aa bb cc
顯示在 aa, bb, cc 文件中匹配 test 的行。
3. grep ‘[a-z]\{5\}’ aa
顯示所有包含每個字符串至少有 5 個連續小寫字符的字符串的行。
4. grep ‘w\(es\)t.*\1′ aa
如果 west 被匹配,則 es 就被存儲到內存中,並標記爲 1,然後搜索任意個字符(.*),這些字符後面緊
跟着 另外一個 es(\1),找到就顯示該行。如果用 egrep 或 grep -E,就不用”\”號進行轉義,直接寫
成’w(es)t.*\1′就可以了。
5. 其他參數
grep -r :明確要求搜索子目錄
grep -d skip : 忽略子目錄
grep -i pattern files :不區分大小寫地搜索。默認情況區分大小寫,
grep -l pattern files :只列出匹配的文件名,
grep -L pattern files :列出不匹配的文件名,
grep -w pattern files :只匹配整個單詞,而不是字符串的一部分(如匹配’magic’,而不
是’magical’),
grep -C number pattern files :匹配的上下文分別顯示[number]行,
grep pattern1 | pattern2 files :顯示匹配 pattern1 或 pattern2 的行,
例如: grep "abc\|xyz" testfile 表示過濾包含 abc 或 xyz 的行
grep pattern1 files | grep pattern2 :顯示既匹配 pattern1 又匹配 pattern2 的行。
grep -n pattern files 即可顯示行號信息
grep -c pattern files 即可查找總行數
3. find
3.1 格式
pathname: find 命令所查找的目錄路徑。例如用.來表示當前目錄,用/來表示系統根目錄,遞歸查找。
-print: find 命令將匹配的文件輸出到標準輸出。
-exec: find 命令對匹配的文件執行該參數所給出的 shell 命令。相應命令的形式爲'command' {} \;,注意{ }和\;之間的空格。
-ok: 和-exec 的作用相同,只不過以一種更爲安全的模式來執行該參數所給出的 shell 命令,在執行
每一個命令之前,都會給出提示,讓用戶來確定是否執行。
-options:
3.2 實例
一. name選項
1. 在自己的根目錄$HOME 中查找文件名符合*.txt 的文件
find ~ -name "*.txt" -print
2. 想要在當前目錄及子目錄中查找所有的‘ *.txt’文件
find . -name "*.txt" -print
3. 想要的當前目錄及子目錄中查找文件名以一個大寫字母開頭的文件
find . -name "[A-Z]*" -print
4. 想要在/etc 目錄中查找文件名以 host 開頭的文件
find /etc -name "host*" -print
5. 想要查找$HOME 目錄中的文件
find ~ -name "*" -print 或 find ~ -print
6. 要想讓系統高負荷運行,就從根目錄開始查找所有的文件:
find / -name "*" -print
7. 如果想在當前目錄查找文件名以兩個小寫字母開頭,跟着是兩個數字,最後是.txt 的文件,下
面的命令就能夠返回例如名爲 ax37.txt 的文件:
find . -name "[a-z][a-z][0-9][0-9].txt" -print
----------------------------------------------------------------------------------
二. 忽略某個目錄
如果在查找文件時希望忽略某個目錄,因爲你知道那個目錄中沒有你所要查找的文件,那麼可
以使用-prune 選項來指出需要忽略的目錄。在使用-prune 選項時要當心,因爲如果你同時使用
了-depth 選項,那麼-prune 選項就會被 find 命令忽略。
1. 如果希望在/apps 目錄下查找文件,但不希望在/apps/bin 目錄下查找
find /apps -path "/apps/bin" -prune -o -print
2. 避開多個文件夾
find /home \( -path /home/itcast/f1 -o -path /home/itcast/f2 \) -prune -o -print
----------------------------------------------------------------------------------
三. 按照更改時間或訪問時間等查找文件
如果希望按照更改時間來查找文件,可以使用 mtime,atime 或 ctime 選項。如果系統突然沒有
可用空間了,很有可能某一個文件的長度在此期間增長迅速,這時就可以用 mtime 選項來查找
這樣的文件。
用減號-來限定更改時間在距今 n 日以內的文件,而用加號+來限定更改時間在距今 n 日以前的
文件。
1. 希望在系統根目錄下查找更改時間在 5 日以內的文件
find / -mtime -5 -print
2.爲了在/var/adm 目錄下查找更改時間在 3 日以前的文件
find /var/adm -mtime +3 -print
----------------------------------------------------------------------------------
四. 使用size選項
可以按照文件長度來查找文件,這裏所指的文件長度既可以用塊(block)來計量,也可以用字
節來計量。以字節計量文件長度的表達形式爲 N c;以塊計量文件長度只用數字表示即可。
1. 在當前目錄下查找文件長度大於 1 M 字節的文件:
find . -size +1000000c -print
2. 在/home/apache 目錄下查找文件長度恰好爲 100 字節的文件:
find /home/apache -size 100c -print
4. 在當前目錄下查找長度超過 10 塊的文件(一塊等於 512 字節):
find . -size +10 -print
----------------------------------------------------------------------------------
五. 其他
1.查看當前目錄中文件屬主具有讀、寫權限,並且文件所屬組的用戶和其他用戶具有讀權限的
文件:
find . -type f -perm 644 -exec ls -l {} \
4. xargs
4.1 格式
4.2 實例
1. 查找系統中的每一個普通文件,然後使用 xargs 命令來測試它們分別屬於哪類文件
find . -type f -print | xargs file
2. 在當前目錄下查找所有用戶具有讀、寫和執行權限的文件,並收回相應的寫權限:
ls -l
find . -perm -7 -print | xargs chmod o-w
ls -l
3. 用 grep 命令在所有的普通文件中搜索 hello 這個詞:
find . -type f -print | xargs grep "hello"
4. 用 grep 命令在當前目錄下的所有普通文件中搜索 hello 這個詞:
find . -name \* -type f -print | xargs grep "hello"
注意:
在上面的例子中, \用來取消 find 命令中的*在 shell 中的特殊含義。
find 命令配合使用 exec 和 xargs 可以使用戶對所匹配到的文件執行幾乎所有的命令。
5.sed
sed 意爲流編輯器(Stream Editor),在 Shell 腳本和 Makefile 中作爲過濾器使用非常普遍,
也就是把前一個程序的輸出引入 sed 的輸入,經過一系列編輯命令轉換爲另一種格式輸出。
sed 和 vi 都源於早期 UNIX 的 ed 工具,所以很多 sed 命令和 vi 的末行命令是相同的。
5.1 格式
5.2 實例
6. awk
sed 以行爲單位處理文件, awk 比 sed 強的地方在於不僅能以行爲單位還能以列爲單位處理文
件。 awk 缺省的行分隔符是換行,缺省的列分隔符是連續的空格和 Tab,但是行分隔符和列分
隔符都可以自定義,比如/etc/passwd 文件的每一行有若干個字段,字段之間以:分隔,就可以
重新定義 awk 的列分隔符爲:並以列爲單位處理這個文件。