掌握一些 Linux 命令行及标准实用工具, 可以大大加强日常任务的处理效率,作为开发的有力辅佐。这篇文章将专注于有用的命令及组合, 记录我在日常生活与工作中遇到的问题及解法。
1. Linux 强力工具:
find : 提供 N 多搜索选项, 在目录结构中寻找满足各种条件的文件集合;
grep : 依靠强大的正则表达式, 在给定文件集合中搜索匹配模式的文本字符串;
sed : 同样依靠强大的正则表达式及编辑命令,执行文本查找/替换
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 ,
重要概念: 正则表达式。 用来描述文本的模式,最重要最强大的 Unix 工具均建立其基础上 , find, sed, awk , grep 等。比如 a* 用来描述零个或多个a ; [1-9]*[0-9]+ 可以匹配任何整数。 推荐 《正则表达式必知必会》, 薄薄的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 的字符串,显示文件名,行号及匹配的行内容。