條條大道通羅馬,羅馬羅馬你在哪之調(diào)教命令行
你可能遇到一些棘手的問題,通過搜索得到想要的結(jié)果,但下次還是要通過搜索解決問題,這種低效的手段不是我們所想要的。典型的就是一個(gè)線上運(yùn)維工程師,當(dāng)問題來臨時(shí),不會(huì)給你留太多的現(xiàn)場(chǎng)學(xué)習(xí)時(shí)間。
為了達(dá)到更高效的訓(xùn)練,我們要做兩件事情:第一,總結(jié)歸納;第二,觸類旁通。Linux的命令也是如此,一個(gè)問題,通常會(huì)有多種解決方式,要通過變化找出其中的共性。
這涉及到一些設(shè)計(jì)者對(duì)于規(guī)范約定俗成的遵守。一般的,你只需要掌握一小部分命令,然后對(duì)大批命令達(dá)到了解的程度,就可以在命令行的世界里游刃有余。舉個(gè)例子,你知道ls是列出文件目錄,你就會(huì)聯(lián)想到lscpu是列出cpu信息;lsmem是列出內(nèi)存信息;lsblk是磁盤信息等。這種共性很多,比如top系列,stat系列。
1、輔助信息
1.1、文件格式
在Linux上工作,是非常非常排斥二進(jìn)制這種格式的,幾乎什么都是可以讀寫的文本內(nèi)容。大多數(shù)命令生成的結(jié)果,也都是文本文件。這些文件有一些特點(diǎn),通常列與列都是通過空格或者
- [root@localhost ~]# lsmem
- RANGE SIZE STATE REMOVABLE BLOCK
- 0x0000000000000000-0x0000000007ffffff 128M online no 0
- 0x0000000008000000-0x000000000fffffff 128M online yes 1
- 0x0000000010000000-0x0000000017ffffff 128M online no 2
- 0x0000000018000000-0x0000000027ffffff 256M online yes 3-4
- 0x0000000028000000-0x000000004fffffff 640M online no 5-9
- 0x0000000050000000-0x000000005fffffff 256M online yes 10-11
- 0x0000000060000000-0x000000007fffffff 512M online no 12-15
- Memory block size: 128M
- Total online memory: 2G
- Total offline memory: 0B
有一大批針對(duì)于行操作的命令,同樣有一批針對(duì)于列操作的命令。然后,有兩個(gè)集大成者,叫做sed、awk。由于這兩個(gè)命令的內(nèi)容非常多,我們將其列為單獨(dú)的章節(jié)。
1.2、幫助信息
通常linux命令都十分簡(jiǎn)單,但是有些還是有些復(fù)雜度的。比如find,ps這種命令,如果要照顧到所有的場(chǎng)合,可能需要非常巨大的篇幅。但是,萬一用到這種偏門的場(chǎng)合怎么辦?
全面了解一下是非常有必要的,以便在使用的時(shí)候能夠喚起記憶中最淺顯的印象。然后剩下的,就可以交給類似于man的這種命令了。Linux上的每一個(gè)命令,都會(huì)有配套的幫助文件,這遠(yuǎn)比網(wǎng)絡(luò)上那些轉(zhuǎn)來轉(zhuǎn)去的信息,正確的多。
正式介紹一下下面的兩個(gè)命令:
- man 用來顯示某個(gè)命令的文檔信息。比如:man ls
- info 你可以認(rèn)為和man是一樣的,雖然有一些能夠互補(bǔ)的內(nèi)容。它們會(huì)在內(nèi)容中進(jìn)行提示的
- --help 很多命令通過參數(shù)--help提供非常簡(jiǎn)短的幫助信息。這通常是最有用最快捷的用例展示。如果你根本就記不住一個(gè)非常拗口的單詞,那就找找這些地方吧
注意:這些幫助信息,僅集中在命令的作用域本身。對(duì)于它的組合使用場(chǎng)景,并沒有過多信息。也就是說,它教會(huì)了你怎么用,但并沒有告訴你用它能夠來做什么。
這些幫助命令,一般會(huì)通過高亮關(guān)鍵字,增加閱讀的體驗(yàn)。但我們可以更近一步,把幫助文件變成彩色的。在root用戶下,執(zhí)行下面的命令。然后,重新登錄虛擬機(jī)。
- cat >> ~/.bashrc <<EOF
- function man()
- {
- env \\
- LESS_TERMCAP_mb=\$(printf "\e[1;31m") \\
- LESS_TERMCAP_md=\$(printf "\e[1;31m") \\
- LESS_TERMCAP_me=\$(printf "\e[0m") \\
- LESS_TERMCAP_se=\$(printf "\e[0m") \\
- LESS_TERMCAP_so=\$(printf "\e[1;44;33m") \\
- LESS_TERMCAP_ue=\$(printf "\e[0m") \\
- LESS_TERMCAP_us=\$(printf "\e[1;32m") \\
- man "\$@"}
- EOF
再次執(zhí)行man命令,就可以看到彩色的信息了。
1.3、TAB補(bǔ)全
現(xiàn)在,在終端里,輸入ca,然后快速按2次
- [root@localhost ~]# ca
- cacertdir_rehash cache_dump cache_repair cache_writeback ca-legacy capsh case catchsegv
- cache_check cache_metadata_size cache_restore cal caller captoinfo cat catman
如果你對(duì)某個(gè)命令,只有模糊的印象,只記得前面的幾個(gè)字母,這個(gè)功能是極好的,命令范圍會(huì)一步步縮減。
2、正則表達(dá)式
為了開始下面的內(nèi)容,我們首先介紹一下正則表達(dá)式。在前面的一些命令中,也可以使用這些正則表達(dá)式,比如less、grep等。
有些書籍,能夠把正則表達(dá)式寫成一本書,我們這里僅作簡(jiǎn)單的介紹,但足夠用了。一般的,正則表達(dá)式能用在匹配上,還能夠把匹配的內(nèi)容拿來做二次利用。關(guān)于后者,我們?cè)趕ed命令中介紹。
標(biāo)志 | 意義 | |
---|---|---|
^ |
行首 | |
$ |
行尾 | |
. |
任意單個(gè)字符 | |
* |
匹配0個(gè)或者多個(gè)前面的字符 | |
+ |
1個(gè)或者多個(gè)匹配 | |
? |
0個(gè)或者1個(gè)匹配 | |
{m} |
前面的匹配重復(fù)m次 | |
{m,n} |
前面的匹配重復(fù)m到n次 | |
[] |
匹配一個(gè)指定范圍內(nèi)的字符 | |
[^] |
匹配指定范圍外的任意單個(gè)字符 | |
\ |
轉(zhuǎn)義字符 | |
[0-9] |
匹配括號(hào)中的任何一個(gè)字符,or的作用 | |
` | ` | or,或者 |
\b |
匹配一個(gè)單詞。比如\blucky\b 只匹配單詞lucky |
使用下面的命令創(chuàng)建一個(gè)文件,我們練習(xí)一下grep命令加上E參數(shù)后的正則表現(xiàn)。
- cat > 996 <<EOF
- 996: 996 is a funcking thing . which make woman as man , man as ass .
- we all on the bus , bus bus on the way . 996
- way to icu. icuuuuuu......
- The greedy green boss rides on the pity programmer
- EOF
在終端執(zhí)行下面命令,注意高亮的部分即為匹配到的字符串。
- # 匹配996開頭的行
- [root@localhost ~]# cat 996 | grep -E ^996
- 996: 996 is a funcking thing . which make woman as man , man as ass .
- # 匹配996結(jié)尾的行
- [root@localhost ~]# cat 996 | grep -E 996$
- we all on the bus , bus bus on the way . 996
- # 匹配到icu和icuuuuuu
- [root@localhost ~]# cat 996 | grep -E icu+
- way to icu. icuuuuuu......
- # 再次匹配到996
- [root@localhost ~]# cat 996 | grep -E [0-9]
- 996: 996 is a funcking thing . which make woman as man , man as ass .
- we all on the bus , bus bus on the way . 996
- [root@localhost ~]# cat 996 | grep -E ^[\^0-9]
- we all on the bus , bus bus on the way . 996
- way to icu. icuuuuuu......
- The greedy green boss rides on the pity programmer
- # 匹配所有不包含996的行,良心命令,淚奔
- [root@localhost ~]# cat 996 | grep -E -v [0-9]{3}
- way to icu. icuuuuuu......
- The greedy green boss rides on the pity programmer
- # 匹配boss和icu
- [root@localhost ~]# cat 996 | grep -E boss\|icu
- way to icu. icuuuuuu......
- The greedy green boss rides on the pity programmer
- # 匹配所有行
- [root@localhost ~]# cat 996 | grep -E .
- 996: 996 is a funcking thing . which make woman as man , man as ass .
- we all on the bus , bus bus on the way . 996
- way to icu. icuuuuuu......
- The greedy green boss rides on the pity programmer
正則表達(dá)式非常的重要,在一些sed腳本中,awk腳本中,甚至是vim編輯器中,都會(huì)簡(jiǎn)化你的操作。以上內(nèi)容應(yīng)該熟記,達(dá)到不需要查找文檔的地步。
3、小結(jié)
本小節(jié)是學(xué)習(xí)技巧方面的內(nèi)容,但我們依然接觸到一些硬核知識(shí)。這可能是除了正統(tǒng)的命令集合之外,最經(jīng)常被使用的技巧了。接下來,我們介紹了一些簡(jiǎn)單的正則,這些正則可用用在很多命令中。我們還提供了一個(gè)把man命令變成彩色的小腳本,下面的文章中,會(huì)默認(rèn)你已經(jīng)把這一步給操作了。
彩色能夠增加閱讀效果(色盲除外)。
4、思考&擴(kuò)展
1、回過頭去,執(zhí)行一下man cat,是否發(fā)現(xiàn)了一個(gè)叫做tac的命令?它是干什么的?
2、上面提到的stat系列,你能想象iostat大體是干什么用的么?
3、grep -v是什么意思?
4、了解一下和mv非常像的rename命令來批量修改文件,看能否使用上面的正則。
5、有些命令如果拼寫錯(cuò)誤,如何快速修正?靠搜索么?了解一下fuck命令。我沒有說錯(cuò)。
6、下面哪種寫法表示如果cmd1成功執(zhí)行,則執(zhí)行cmd2命令?
- A. cmd1&&cmd2
- B. cmd1|cmd2
- C. cmd1;cmd2
- D. cmd1||cmd2
End
咦?小王呢?
環(huán)顧四周,一片空空。別說羅馬,小王都不見了。