linux shell 正則表達式

目錄

1. 基本語法

1.1 字符類

1.2 數量限定類

2. grep

2.1 作用

2.2 格式

2.3 實例

3. find

3.1 格式

3.2 實例

4. xargs

4.1 格式

4.2 實例

5.sed

5.1 格式

5.2 實例

6. awk

6.1 格式

6.2 實例


 


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 的列分隔符爲:並以列爲單位處理這個文件。

6.1 格式

6.2 實例
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章