每個Linux用戶都應(yīng)該了解的命令行省時技巧
有網(wǎng)友在問答網(wǎng)站Quora上提問:“有哪些省時小技巧,是每個Linux用戶都應(yīng)該知道的?” Joshua Levy 平常就在 Linux 平臺工作,并且他積累了不少實用命令行技巧,他在回復(fù)中精選出一部分。對技術(shù)用戶來說,這些技巧挺重要或?qū)嵱茫赖娜瞬⒉欢?。下文略有點長,一般來說,用戶也不需要對全部內(nèi)容都了解,但為了達到省時方便的目的,Joshua Levy 仍不遺余力做了校對,以保證列出的每一條都值得一讀,前提是你是一位Linux重度用戶。
為了獲取文中提到的一個命令的更多信息,先試下“man <命令名稱>”,在一些情況下,為了讓這條命令可以正常執(zhí)行,你必須安裝相應(yīng)的包,可以用aptitude 或者 yum。如果失敗了,求助Google。
基礎(chǔ)篇
1、學(xué)習(xí)基礎(chǔ)的Bash。事實上,讀整個的bash的幫助手冊;很容易理解而且篇幅也不算長。其他一些可選的shell外觀可能更漂亮,但是bash功能很強大而且總是能用(主要學(xué)習(xí)zsh或者tcsh在很多情況下你會受到限制)。
2、學(xué)習(xí)vim,對于Linux下的隨機編輯,幾乎沒有工具能出其右(即使你大部分的時間里都在使用Emacs或者Eclipse)。
3、通過ssh-agent,ssh-add等命令,了解ssh,以及跳過每次登陸時密碼驗證的基礎(chǔ)辦法,。
4、熟悉bash下的工作管理: &,Ctrl-Z,Ctrl-C,jobs,fg,bg,kill, 等等。
5、基礎(chǔ)的文件管理:ls 以及 ls -l (特別的,學(xué)習(xí)”ls -l”中列出的每一列字段的含義),less,head,tail,tail -f,ln,ln -s (學(xué)習(xí)軟鏈接和硬鏈接的區(qū)別),chown,chmod,du(快速了解磁盤總體占用情況),df,mount。
6、基礎(chǔ)的網(wǎng)絡(luò)管理命令:ip 或者 ifconfig,dig。
7、了解正則表達式,以及grep、egrep的不同命令選項,-0,-A,-B 都值得了解一下。
8、學(xué)習(xí)使用apt-get 或者 yum(取決于你的發(fā)行包)來找到并安裝你需要的包.
日常使用篇
- 使用bash時,用Ctrl-R來搜索命令的歷史記錄。
- 使用bash時,用Ctrl-W來清除最后一個單詞,使用Ctrl-U來清除整行??梢圆榭磎an readline來獲取bash里面默認(rèn)鍵的綁定設(shè)置。內(nèi)容很多。比如Alt-.(注:點)遍歷之前命令中使用過的參數(shù),Alt-* 擴展了參數(shù)的匹配模式。
- 回到上次的工作目錄:cd -。
- 如果你的命令敲到一半時改變了主意,可以用Alt-#來在命令前面增加一個#,使之成為一行注釋(或者使用Ctrl-A回到命令開頭,然后再鍵入#)。你可以之后再通過搜索歷史記錄回來。
- 使用xargs(或者parallel)。它非常強大。注意你能控制每一行(-L)執(zhí)行多少項,也能控制如何并發(fā)(- P)。如果你不太確定它會如你所愿的工作,先使用xargs。 再者,-l{} 很有用。例如:
- find . -name \*.py | xargs grep some_function
- cat hosts | xargs -l{} ssh root@{} hostname
- pstree -p 可以很方便的顯示整個進程樹。
- 使用pgrep 和pkill 來通過名字來發(fā)現(xiàn)進程或者給進程發(fā)信號(-f選項會有用)。
- 了解你能向進程發(fā)送的信號種類。比如,要掛起一個進程,使用kill -STOP [進程ID]。要了解整個列表,請參考man 7 signal。
- 如果你想讓一個后臺進程一直運行,使用nohup or disown 。
- 通過netstat -lntp 來檢測哪些進程在監(jiān)聽。同樣可以用lsof。
- bash腳本中,使用set -x 來調(diào)試輸出。使用set -e在有錯誤時終止時終止執(zhí)行。要想嚴(yán)格輸出錯誤,可以考慮使用set -o pipefail(雖然這個主題說起來有些復(fù)雜)。對于更復(fù)雜的腳本,也可以使用trap。
- bash腳本中,子shell(通過寫在括號里)是一種組織命令的方便的方法。一個很常見的例子是暫時移動到另外一個工作目錄,例如:
1
2
3
|
#在當(dāng)前目錄下做一些事情
(cd /一些/另外的/目錄;執(zhí)行別的操作)
#繼續(xù)在原來的目錄下執(zhí)行
|
- 要注意bash中有很多種變量表達式。檢查一個變量是否存在:${name:?錯誤信息}。例如:如果一個bash腳本需要一個單變量,只需要寫input_file=${1:?usage: $0 inpute_file}。數(shù)值擴展:i=$({(i+1)%5})。序列:{1..10}。字符串的整理:${var%suffix} 和${var#prefix}。例如:
1if var==foo.pdf, then echo ${var%.pdf}.txt #會打印"foo.txt"。
- 通過 <(其他指令),一條命令的輸出可以被當(dāng)作是一個文件的內(nèi)容來對待。 例如,比較本地和遠(yuǎn)程的 /etc/hosts 文件,可以用diff /etc/hosts <(ssh [遠(yuǎn)程主機] cat /etc/hosts)。
- 了解bash中的“here documents”,比如 cat <<EOF …
- bash中,通過 其他指令 > 日志文件 2>&1 把標(biāo)準(zhǔn)輸出以及標(biāo)準(zhǔn)錯誤重定向。常見的情況是,為了保證一條指令沒有為標(biāo)準(zhǔn)輸入留下一個打開的文件描述符,從而輸出至你當(dāng)前所在的終端,增加“</dev/null” 也是好的習(xí)慣。
- 用man ascii可以得到一個完整的ASCII表,有對應(yīng)的16進制和10進制的值。
- 通過ssh連接遠(yuǎn)程終端時,使用screen或者dtach 來保持你的session,防止被打斷。在ssh中,了解如何使用-L或者-D選項(有時也會用到-R)會很有用處,比如,如果通過從一個遠(yuǎn)程的服務(wù)器訪問一個網(wǎng)頁。
- 優(yōu)化你的SSH選項也可能管用。比如,下面的.ssh/config 內(nèi)容在一些網(wǎng)絡(luò)環(huán)境下可以防止連接掉線,當(dāng)連接到新主機時不需要再次確認(rèn),跳轉(zhuǎn)驗證,并且還使用了壓縮(對在一些低寬帶的連接環(huán)境下使用scp時會有幫助)。
- TCPKeepAlive=yes
- ServerAliveInterval=15
- ServerAliveCountMax=6
- StrictHostKeyChecking=no
- Compression=yes
- ForwardAgent=yes
數(shù)據(jù)處理篇
- 把HTML轉(zhuǎn)成文本:lynx -dump 標(biāo)準(zhǔn)輸入
- 如果要處理XML,xmlstarlet會很棒。
- 對于Amazon S3,s3cmd 很方便(雖然還不太成熟,可能會有一些不太好的特性)。
- 了解sort 以及 uniq(包括uniq的 -u 以及 -d 選項)。
- 了解cut,paste,join 來操作文本文件。許多人使用cut但卻忘了還有join。
- 當(dāng)你要在文件之間做集合的加,減,以及差運算時,用sort/uniq是非常方便的。假如a和b是兩個已經(jīng)去重的文本文件,那么運算起來會很快,而且可以在任意大小的文件之間執(zhí)行操作,甚至可以到GB字節(jié)大小。(sort不受內(nèi)存限制,不過如果/tmp 在一個很小的root分區(qū)的話,你可能需要使用-T選項)
- cat a b | sort | uniq > c # c is a union b
- cat a b | sort | uniq -d > c # c is a intersect b
- cat a b b | sort | uniq -u > c # c is set difference a - b
- 了解本地化會影響到許多命令行的工作,包括排序的順序和性能。多數(shù)的linux安裝包會把LANG或者其他一些本地化的變量設(shè)置為類似美國英語的一個本地設(shè)置。這會讓sort和其他一些命令運行起來慢很多。(注意即使你使用UTF-8編碼的文本,你仍然可以放心的通過ASCII碼的順序來排序,這一點用處很多)為避免i18n拖慢日常的工作,使用傳統(tǒng)的基于字節(jié)的排序順序,使用export LC_ALL=C(實際上,考慮在你的.bashrc里加進去)。
- 了解基本的AWK和sed命令來做簡單的數(shù)據(jù)處理。例如:對一個文本文件的第三列的數(shù)字求和:awk ‘{x += $3} END {print x}’。 這大概比同等的python速度要快三倍并且代碼長度也會簡短3倍。
- 就地替換一個字符串在所有文件里所有出現(xiàn)的地方。
- perl -pi.bak -e 's/old-string/new-string/g' my-files-*.txt
- 使用shuf來隨機打亂一個文件中的行或者選擇一個隨機的行。
- 了解sort的各個選項。知道鍵值是如何工作的。特別是,當(dāng)你要使用 -k1時,要格外注意:1只對第一個字段排序,-k1則意味著根據(jù)整個行排序。
- 穩(wěn)定排序(sort -s)可能會有用。例如,先根據(jù)第二個字段排序,再根據(jù)第一個字段排序時,你可以使用sort -k1,1 | sort -s -k2,2
- 如果你需要在bash里的命令行里寫入一個tab鍵的字面值的話,按Ctrl+V, <tab> 或者$‘\t’ (后者更好,因為你可以復(fù)制、粘貼)。
- 對于二進制文件,使用hd來進行簡單的導(dǎo)出16進制表示或者用bvi進行二進制的編輯。
- 對于二進制文件,strings(還有g(shù)rep等等)可以讓你發(fā)現(xiàn)文件的字節(jié)位(0101).要對文件轉(zhuǎn)編,可以試下iconv,或者如果要使用更高級的用法,試試uconv,它可以支持一些高級的Unicode方面的事情。比如,這條命令可以將重音都小寫,并且去掉(通過擴展并且丟掉):
- uconv -f utf-8 -t utf-8 -x '::Any-Lower; ::Any-NFD; [:Nonspacing Mark:] >; ::Any-NFC; ' < input.txt > output.txt
- 要將文件切片,可以試試split(根據(jù)大小切分)或者csplit(根據(jù)模式切分)。
系統(tǒng)調(diào)試篇
- 對于web調(diào)試來說,curl和curl -l會有用,以及和wget相同的那部分功能。
- 如果想了解磁盤/cpu/網(wǎng)絡(luò)的狀態(tài),可以使用iostat,netstat,top(更好一些的話,用htop),以及(尤其是)dstat,對于想快速了解系統(tǒng)當(dāng)前正在發(fā)生的事情,非常的方便。如果想了解內(nèi)存當(dāng)前的狀態(tài),可以使用free以及vmstat,還要了解各項輸出的含義。特別值得一提的是,你要知道“cached”的數(shù)值是linux內(nèi)核保留用來做文件緩存的空間的大小,所以真正可用的有效內(nèi)存是“free”項的對應(yīng)值。
- java的系統(tǒng)調(diào)試則完全是另外一回事,但在Sun以及其他的JVM上有一個簡單的技巧,就是你可以運行kill -3 <pid> ,得到一個完整的棧調(diào)用軌跡以及堆使用的總體情況(包括產(chǎn)生的垃圾回收細(xì)節(jié),這里面包含有很多的信息),會被定向到標(biāo)準(zhǔn)錯誤或者日志。
- 使用mtr作為更好的網(wǎng)絡(luò)追蹤,識別網(wǎng)絡(luò)存在的問題。
- 要查看一個磁盤是否是滿的,ncdu要比一般用的“du -sk *”要快。
- 要查看哪些socket或者進程在占用帶寬,試試iftop或者netlogs。
- ab 工具(隨apache的安裝包一起發(fā)布)對于檢測網(wǎng)絡(luò)服務(wù)器的性能很有幫助,對于更加復(fù)雜的壓力測試,可以試下siege。對于更加嚴(yán)重的網(wǎng)絡(luò)問題的調(diào)試,試試wireshark或者tshark。了解strace和ltrace。這在一個程序突然失敗,掛掉,或者崩潰,而你卻不知所措,或者是你想知道程序的整體性能的情況時,會很有幫助。可以注意下-c和-p選項。
- 了解用ldd來檢查共享庫函數(shù)等的一些問題。
- 了解如何用gdb連接到一個正在運行的程序,并且得到它的調(diào)用堆棧。
- 使用/proc. 對于現(xiàn)場調(diào)試問題會很有幫忙。例如:/proc/cpuinfo, /proc/xxx/cwd, /proc/xxx/exe, /proc/xxx/fd/, /proc/xxx/smaps。
- 當(dāng)要調(diào)試過去一段時間內(nèi)出現(xiàn)的問題時,sar 會有用,它可以顯示過去一段時間內(nèi)的CPU,內(nèi)存,網(wǎng)絡(luò)的統(tǒng)計信息。
- 對于更深層次的系統(tǒng)性能優(yōu)化,可以關(guān)注下stap(systemtap)或者perf。
- 當(dāng)出現(xiàn)了一些很詭異的問題時,可以試下dmesg(比如硬件或者驅(qū)動的問題)。
原文鏈接: Joshua Levy 翻譯: 伯樂在線 - 高磊