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