原創:小姐姐味道(微信公眾號ID:xjjdog),歡迎分享,轉載請保留出處。任何不保留此宣告的轉載都是抄襲。
你可能遇到一些棘手的問題,通過搜尋得到想要的結果,但下次還是要通過搜尋解決問題,這種低效的手段不是我們所想要的。典型的就是一個線上運維工程師,當問題來臨時,不會給你留太多的現場學習
時間。
為了達到更高效的訓練,我們要做兩件事情:第一,總結歸納;第二,觸類旁通。Linux的命令也是如此,一個問題,通常會有多種解決方式,要通過變化找出其中的共性。
這涉及到一些設計者對於規範約定俗成的遵守。一般的,你只需要掌握一小部分命令,然後對大批命令達到了解的程度,就可以在命令列的世界裡遊刃有餘。舉個例子,你知道ls
是列出檔案目錄,你就會聯想到lscpu
是列出cpu資訊;lsmem
是列出記憶體資訊;lsblk
是磁碟資訊等。這種共性很多,比如top
系列,stat
系列。
1、輔助資訊
1.1、檔案格式
在Linux上工作,是非常非常排斥二進位制這種格式的,幾乎什麼都是可以讀寫的文字內容。大多數命令生成的結果,也都是文字檔案。這些檔案有一些特點,通常列與列都是通過空格或者<TAB>
鍵分隔的。比如下面lsmem
的結果,這種有規律的,有章可循的檔案,是非常容易被處理的。
[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
複製程式碼
有一大批針對於行操作的命令,同樣有一批針對於列操作的命令。然後,有兩個集大成者,叫做sed
、awk
。由於這兩個命令的內容非常多,我們將其列為單獨的章節。
1.2、幫助資訊
通常linux命令都十分簡單,但是有些還是有些複雜度的。比如find
,ps
這種命令,如果要照顧到所有的場合,可能需要非常巨大的篇幅。但是,萬一用到這種偏門的場合怎麼辦?
全面瞭解一下是非常有必要的,以便在使用的時候能夠喚起記憶中最淺顯的印象。然後剩下的,就可以交給類似於man
的這種命令了。Linux上的每一個命令,都會有配套的幫助檔案,這遠比網路上那些轉來轉去的資訊,正確的多。
正式介紹一下下面的兩個命令:
man
用來顯示某個命令的文件資訊。比如:man ls
info
你可以認為和man是一樣的,雖然有一些能夠互補的內容。它們會在內容中進行提示的--help
很多命令通過引數--help
提供非常簡短的幫助資訊。這通常是最有用最快捷的用例展示。如果你根本就記不住一個非常拗口的單詞,那就找找這些地方吧
注意:這些幫助資訊,僅集中在命令的作用域本身。對於它的組合使用場景,並沒有過多資訊。也就是說,它教會了你怎麼用,但並沒有告訴你用它能夠來做什麼。
這些幫助命令,一般會通過高亮關鍵字,增加閱讀的體驗。但我們可以更近一步,把幫助檔案變成彩色的。在root使用者下,執行下面的命令。然後,重新登入虛擬機器。
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
複製程式碼
再次執行man命令,就可以看到彩色的資訊了。
1.3、TAB補全
現在,在終端裡,輸入ca
,然後快速按2次<TAB>
鍵盤,命令列會進入補全模式,顯示以ca打頭的所有命令。
[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
複製程式碼
如果你對某個命令,只有模糊的印象,只記得前面的幾個字母,這個功能是極好的,命令範圍會一步步縮減。
2、正規表示式
為了開始下面的內容,我們首先介紹一下正規表示式。在前面的一些命令中,也可以使用這些正規表示式,比如less、grep等。
有些書籍,能夠把正規表示式寫成一本書,我們這裡僅作簡單的介紹,但足夠用了。一般的,正規表示式能用在匹配上,還能夠把匹配的內容拿來做二次利用。關於後者,我們在sed
命令中介紹。
標誌 | 意義 |
---|---|
^ |
行首 |
$ |
行尾 |
. |
任意單個字元 |
* |
匹配0個或者多個前面的字元 |
+ |
1個或者多個匹配 |
? |
0個或者1個匹配 |
{m} |
前面的匹配重複m次 |
{m,n} |
前面的匹配重複m到n次 |
[] |
匹配一個指定範圍內的字元 |
[^] |
匹配指定範圍外的任意單個字元 |
\ |
轉義字元 |
[0-9] |
匹配括號中的任何一個字元,or的作用 |
| |
or,或者 |
\b |
匹配一個單詞。比如\blucky\b 只匹配單詞lucky |
使用下面的命令建立一個檔案,我們練習一下grep命令加上E
引數後的正則表現。
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
複製程式碼
在終端執行下面命令,注意高亮的部分即為匹配到的字串。
# 匹配996開頭的行
[root@localhost ~]# cat 996 | grep -E ^996
996: 996 is a funcking thing . which make woman as man , man as ass .
# 匹配996結尾的行
[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
複製程式碼
正規表示式非常的重要,在一些sed指令碼中,awk指令碼中,甚至是vim編輯器中,都會簡化你的操作。以上內容應該熟記,達到不需要查詢文件的地步。
3、小結
本小節是學習技巧方面的內容,但我們依然接觸到一些硬核知識。這可能是除了正統的命令集合之外,最經常被使用的技巧了。接下來,我們介紹了一些簡單的正則,這些正則可用用在很多命令中。我們還提供了一個把man命令變成彩色的小指令碼,下面的文章中,會預設你已經把這一步給操作了。
彩色能夠增加閱讀效果(色盲除外)。
4、思考&擴充套件
1、回過頭去,執行一下man cat
,是否發現了一個叫做tac
的命令?它是幹什麼的?
2、上面提到的stat
系列,你能想象iostat
大體是幹什麼用的麼?
3、grep -v
是什麼意思?
4、瞭解一下和mv非常像的rename
命令來批量修改檔案,看能否使用上面的正則。
5、有些命令如果拼寫錯誤,如何快速修正?靠搜尋麼?瞭解一下fuck
命令。我沒有說錯。
6、下面哪種寫法表示如果cmd1成功執行,則執行cmd2命令?
- A. cmd1&&cmd2
- B. cmd1|cmd2
- C. cmd1;cmd2
- D. cmd1||cmd2
End
咦?小王呢?
環顧四周,一片空空。別說羅馬,小王都不見了。
作者簡介:小姐姐味道 (xjjdog),一個不允許程式設計師走彎路的公眾號。聚焦基礎架構和Linux。十年架構,日百億流量,與你探討高併發世界,給你不一樣的味道。我的個人微信xjjdog0,歡迎新增好友,進一步交流。
8 man 5 info 1 lsmem 1 lscpu 6 2 lsblk 1 stat 1 top 1 find 6 regex