掌握一些 Linux 命令列及標準工具 + 生產力, 可以大大加強日常任務的處理效率,作為開發的有力輔佐。這篇文章將專註於有用的命令及組合, 記錄我在日常生活與工作中遇到的問題及解法。
1. Linux 強力工具:
find : 提供 N 多搜尋選項, 在目錄結構中尋找滿足各種條件的檔案集合;
grep : 依靠強大的Regex, 在給定檔案集合中搜尋匹配模式的文本字串;
sed : 同樣依靠強大的Regex及編輯命令,執行文本尋找/替換
awk : 特別適合於記錄檔案的資料處理。
sort: : 提供了很多選項對記錄型檔案和非記錄型檔案的排序
man : 詳細的可讀性良好的協助資訊 , --help , info
2. Linux 常用命令及Shell 重要元素:
|, >, <, >> , &&, /dev/null ,
echo, cat, ls, head, tail , wc, cut, join, printf, tr , uniq, tee ,
cd, cp, mv, rm, mkdir, locate, which, whereis , who, chmod, touch, file, xargs , df , md5sum ,
read, set, test, . , sh , type, export , env, unset, readonly , shift , getopts , exit, exec, eval ,
fc, fg, trap, kill, jobs, ps, pwd, /proc/pid, crontab, at, sleep, top,
$HOME , $ENV, $IFS, $PWD, $PS1, $PS2, $((EXPR)), $#, $@, $1-$9, ${10-...}, $* , $?, $$, [ ], &n, ${cmd-replacement}, /dev/null, /dev/stty
${varname:-word}, ${varname:=word}, ${var#pattern} , ${var##pattern}, ${var%pattern}, ${var%%pattern} ,
for var in $@ do ... done ; case $var in patt1-N) dosome ;; esac ;
if cond then statement elif cond2 then statement2 ... else statement3 fi;
3. 命令組合:
(1) sed -i 's/@Override//g' $(find . -name '*.java')
find . -name '*.java' | xargs sed -i 's/@Override//g'
此命令用於將目前的目錄及其子目錄下的所有 .java 檔案中的 @Override 註解去掉。 $(find . -name '*.java') 使用了命令替換功能, Shell 會將該命令執行得到的結果作為 sed 的輸入參數。 sed 是文本替換的重要工具, -i 是就地置換,直接在被編輯檔案中置換,如果沒有的話是不會修改原檔案的,只會將修改輸出到標準螢幕上。 's/oldtextpatt/newtext/g' 稱為 sed 命令的編輯命令, 可以執行全域替換, 將所有匹配 oldtextpatt
的文本替換為 newtext . 還可以將多條編輯命令寫在檔案裡,比如 pat_file , 然後用 -f pat_file 來調用。
由於命令列的長度有限, 而 find 找到的檔案都將作為命令列參數,有可能超出限制, 因此, 更好的解決方案是使用 xargs , 它讀取管道輸入並轉化為緊隨其後的命令的參數, 從而不擔心受到命令列字元長度限制。
擴充: *.java 是檔案匹配形式, 可以換成 *.c , *.h , *.{c,java,h,deb,tar.{gz,bz2},js,php,html}(注意,中間不能有空格) 等;
重要工具: sed , find ,
重要概念: Regex。 用來描述文本的模式,最重要最強大的 Unix 工具均建立其基礎上 , find, sed, awk , grep 等。比如 a* 用來描述零個或多個a ; [1-9]*[0-9]+ 可以匹配任何整數。 推薦 《Regex必知必會》, 薄薄的100多頁, 相當好的正則入門書籍。
(2) while IFS=: read var1 var2 ... varN do ... done < inputfile ;
cmd | while IFS=: read var1var2 ... varN do .... done
將輸入檔案或管道輸出的每一行資料用 IFS 分割成多個欄位然後賦值給 var1, var2, ..., varN 進行某種處理,直到輸入檔案或管道輸出的所有行都讀完為止。
(3) find . -name '*.java' | xargs awk ' $0 ~ /vm_monitor/ { printf "%s : Line %s :\n%s \n" , FILENAME, FNR, $0 } ' | sed 's/^[[:space:]]\{1,\}/ /'
在目前的目錄及子目錄下的所有 .java 檔案中尋找匹配模式 vm_monitor 的字串,顯示檔案名稱,行號及匹配的行內容。