Linux 命令和工具学习笔记

时间:2021-11-07 11:11:12


       掌握一些 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 的字符串,显示文件名,行号及匹配的行内容。