Shell中通配符的具體使用
1. 通配符(Wildcard)
在 Shell 中命令中,通常會(huì)使用通配符表達(dá)式來(lái)匹配一些文件,如以下命令可以查找當(dāng)前目錄下所有后綴為 .xml 的文件
find . -name "*.xml"
Shell 中可以使用的通配符如下:
通配符 | 含義 | 實(shí)例 |
---|---|---|
* | 匹配 0 或多個(gè)字符 | a*b ,a與b之間可以有任意長(zhǎng)度的任意字符, 也可以一個(gè)也沒有, 如 aabcb, axyzb, a012b, ab |
? | 匹配任意單個(gè)字符 | a?b ,a與b之間有且只有一個(gè)字符, 可以是任意字符, 如 aab, abb, acb, a0b |
[list] | 匹配 list 中的任意單個(gè)字符 | a[xyz]b ,a與b之間必須也只能有一個(gè)字符, 但只能是 x 或 y 或 z, 如 axb, ayb, azb。 |
[!list] | 匹配除 list 中的任意單一字符 | a[!0-9]b ,a與b之間必須也只能有一個(gè)字符, 但不能是阿拉伯?dāng)?shù)字, 如 axb, aab, a-b。 |
[c1-c2] | 匹配 c1-c2 中的任意單一字符 | a[0-9]b ,匹配0與9之間其中一個(gè)字符,如 a0b, a1b... a9b |
{s1,s2,...} | 匹配 s1 或 s2 (或更多)中的一個(gè)字符串 | a{abc,xyz,123}b ,a與b之間只能是abc或xyz或123這三個(gè)字符串之一 |
2. 轉(zhuǎn)義字符
有的時(shí)候,我們匹配的內(nèi)容里面會(huì)存在 *
,?
,[
等通配符中的符號(hào)。為了表示他們?cè)瓉?lái)的意思,我們需要使用轉(zhuǎn)義字符 \
,如 a\[ac\]c
表示匹配 a[a]c
或 a[c]c
。\
本身用 \\
表示。
3. 例子
有時(shí),我們需要對(duì)當(dāng)前目錄中的所有文件進(jìn)行操作,比如用 tar
命令將當(dāng)前目錄下的所有文件打包,又如用 scp
命令將當(dāng)前目錄下的所有文件傳輸?shù)搅硪慌_(tái)主機(jī)上。以 scp
的使用為例,我們可能會(huì)這么寫這個(gè)命令:
scp -r * username@hostname:path
但是,有的時(shí)候會(huì)發(fā)現(xiàn)一些奇怪的問題。比如說(shuō),我在本機(jī)開著 vim 編輯著一個(gè)文件,編輯完了之后 w
保存,然后用上面的命令把當(dāng)前目錄下的文件傳到另一臺(tái)主機(jī)。如果你在另一臺(tái)主機(jī)上用 vim 打開這個(gè)文件,vim 會(huì)報(bào)錯(cuò),
Swap file ".filename.swp" already exists!
這是因?yàn)?vim 在打開一個(gè)文件編輯時(shí),會(huì)產(chǎn)生一個(gè) Swap file,這個(gè) file 里面存的是編輯時(shí)對(duì)文檔產(chǎn)生的改變,當(dāng) Vim 崩潰了之類的問題發(fā)生時(shí),可以從這個(gè) Swap file 恢復(fù)。Swap file 會(huì)在退出該文檔時(shí)被移除。如果用戶試圖打開一個(gè)已存在 Swap file 的文檔時(shí),vim 就會(huì)報(bào)錯(cuò),防止多個(gè)用戶同時(shí)編輯同個(gè)文件的情況的發(fā)生。
由于之前只保存了文檔而沒有退出,所以這個(gè)暫時(shí)性的 Swap file 還存在當(dāng)前目錄中,隨著 scp
命令一起被傳送到了目標(biāo)主機(jī)中。
在我們的期望中,是不希望這個(gè)暫時(shí)性的文件被傳輸?shù)摹S捎?Swap file 的格式為 .filename.swp。我們可在開頭的 .
做文章,讓 scp
不傳輸以 .
開頭的文件。
scp -r [!.]* username@hostname:path
以 .
開頭的文件一般為配置文件,緩存之類,通常都是不希望被傳輸?shù)摹#ㄓ袝r(shí)候傳輸了之后,發(fā)現(xiàn)有問題,但是 ls
了半天也沒找出問題,因?yàn)樗麄兡J(rèn)是隱藏的,用 ls -a
才能查看)。
4. 分清楚通配符表達(dá)式和正則表達(dá)式
通配符看起來(lái)和正則表達(dá)式很像,但他們并不是同一種東西。正則表達(dá)式中的那些量詞的匹配規(guī)則和這里提到的幾個(gè)通配符的匹配規(guī)則并不相同。如正則表達(dá)式中 *
表示重復(fù)前一個(gè)字符任意次, 而通配符表達(dá)式中 *
表示 0 或多個(gè)任意字符。在正則表達(dá)式中,ab*
表示的是那些 a
后面跟 0 個(gè)或多個(gè) b
的字符串,而通配符表達(dá)式中 ab*
表示的是那些 ab
后面跟任意個(gè)字符的字符串。
而且正則表達(dá)式一般是部分匹配的,用來(lái)匹配內(nèi)容中的一部分,如用正則表達(dá)式 a
去匹配 bac
這段字符串時(shí),匹配是成功的,匹配到的內(nèi)容是 a
。但是通配符表達(dá)式的話是全部匹配的,表達(dá)式要匹配整個(gè)字符串才算匹配成功,如用通配符表達(dá)式 a
取匹配 bac
這段字符串時(shí),匹配是失敗的。
在 Shell 命令中,通常用通配符表達(dá)式來(lái)匹配文件名,而用正則表達(dá)式來(lái)匹配一段文本內(nèi)容。以 grep
命令為例,grep
命令可以在指定的文件中,挑選出和表達(dá)式匹配的那些行,其中指定文件是用的通配符表達(dá)式,而文本內(nèi)容的匹配用的是正則表達(dá)式。
今天使用 grep
時(shí),就因?yàn)闆]分清楚他們,忙活了半天。情況是這樣的,我想看一個(gè) jar 包里是不是有 pom 相關(guān)的文件,所以就輸入了下面命令
jar tf maven-model-builder-3.5.3.jar | grep 'pom*'
結(jié)果輸入了一堆文件,而且很多文件都沒有 pom 這串字符串的。輸出內(nèi)容是這樣的:
... org/apache/maven/model/composition/ org/apache/maven/model/interpolation/ org/apache/maven/model/superpom/ org/apache/maven/model/composition/DependencyManagementImporter.class ...
這就是因?yàn)槲野淹ㄅ浞磉_(dá)式和正則表達(dá)式搞混了,后來(lái)知道原因后,用下面的命令才得到想要的內(nèi)容。
jar tf maven-model-builder-3.5.3.jar | grep 'pom.*'
使用 Shell 命令時(shí),要分清楚哪里用的是通配符表達(dá)式,哪里用的是正則表達(dá)式。
到此這篇關(guān)于Shell中通配符的具體使用的文章就介紹到這了,更多相關(guān)Shell 通配符內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Shell腳本實(shí)現(xiàn)C語(yǔ)言代碼行數(shù)統(tǒng)計(jì)
這篇文章主要介紹了Shell腳本實(shí)現(xiàn)C語(yǔ)言代碼行數(shù)統(tǒng)計(jì),本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-05-05shell 腳本安裝PHP擴(kuò)展的簡(jiǎn)單方法
下面小編就為大家?guī)?lái)一篇shell 腳本安裝PHP擴(kuò)展的簡(jiǎn)單方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03Shell實(shí)現(xiàn)的iptables管理腳本分享
這篇文章主要介紹了Shell實(shí)現(xiàn)的iptables管理腳本分享,本文腳本實(shí)現(xiàn)了添加、刪除、查看、停止、啟動(dòng)等,需要的朋友可以參考下2014-12-12