Linux 命令和工具学习笔记


       掌握一些 Linux 命令行及标准实用工具, 可以大大加强日常任务的处理效率,作为开发的有力辅佐。这篇文章将专注于有用的命令及组合, 记录我在日常生活与工作中遇到的问题及解法。 


        1.   Linux 强力工具:

              find :   提供 N 多搜索选项, 在目录结构中寻找满足各种条件的文件集合;  --- 搜索文件

              grep :  依靠强大的正则表达式,  在给定文件集合中搜索匹配模式的文本字符串; --- 搜索字符串

              sed :   同样依靠强大的正则表达式及编辑命令,执行文本查找/替换; --- 文本查找与替换

              awk :   特别适合于记录文件的数据处理; --- 记录文件处理

              sort:  :  提供了很多选项对记录型文件和非记录型文件的排序;  --- 排序

              man :  详细的可读性良好的帮助信息 ,  --help ,   info ;  --- 帮助


        2.   Linux 常用命令及Shell 重要元素:

             (1)  常用命令: 

                        echo: 回现内容;

                        cat:    显示文件内容;  head:显示文件前若干行; tail: 显示文件末尾若干行;

                        pwd:  显示当前所在目录;

                        ls:      获取当前目录下文件与目录列表及详情; 

                        wc:    对文件进行单词、字符、行计数;

                        cut:   截取文件记录行的某列或某几列;

                        join:  连接多个文件的记录列;

                        tr:      字符串截取 ;    tee:  字符串转换;

                       uniq:  重复行处理;

                        cd:     切换目录;

                        cp :    复制文件或目录; mv ; 移动文件或目录; 重命名文件;  rm: 删除文件或目录; 

                       mkdir :  创建目录;

                       which: 定位命令所在路径; whereis : 找出命令相关的文件及路径;

                       who:    显示当前登录用户;

                       chmod:更改文件权限;

                       touch: 改变文件创建或修改时间, 可用于创建空文件;

                       file:     显示文件类型;eg.  ls | xargs file ;

                       xargs: 将前一个命令的输出转化为文件列表作为指定命令的输入, 常见形式是 cmdx | xargs cmdy

                       df :     磁盘使用情况;

                       md5sum: 获取 md5sum 值;

                       .  xx.sh,  sh xx.sh :  执行脚本 xx.sh ;

                       read:    从控制台读取输入;

                       export: 导出变量到当前 SHELL 环境;

                       env  :      显示或设置环境变量;

                       kill:      杀死进程, 一般使用 ps 命令找到相应进程的进程ID,然后使用 kill 干掉;  eg. kill -9 pid

                       ps:       显示进程信息, 一般使用 ps aux ;   

                       top:     系统最近一段时间的负载;

                       fc :      fc命令自动调用vi编辑器修改已有历史命令,当保存时立即执行修改后的命令,也可以用来显示历史命令;

                       fg:       将后台任务提到前端来执行;

                       crontab:  设置定时任务;

                       history :   显示历史命令; !n  执行历史命令中的第n条;

              (2) 重要符号

                        cmdx | cmdy :  管道, 将 命令 cmdx 的输出作为 cmdy 的输入;

                        cmd < file: 重定向输入, 从指定文件 file 读取内容作为 cmd 的输入;

                        cmd > file :   重定向输出, 将命令 cmd 的输出到从控制台的内容重定向到指定文件 file 中(若 file 已存在则覆盖其内容);

                        cmd >>  file:  追加重定向输出, 与 > 类似, 但是输出是追加到 file 中, 而不是覆盖 file 已有内容;

                        cmdx &&  cmdy:  命令组合串行执行。 若 cmdx 执行成功,则执行 cmdy, 否则报错, 并且不执行 cmdy;

                        cat /dev/null > file  :  清空 file 文件内容  ;

                        cmd & : 将命令转入后台执行;

              (3) 常用变量(可使用 echo $xxx 显示相关内容)

                         $HOME: 用户主目录, 一般是 /home/your_user_name , 同 ~ ;  env 命令可显示当前用户的环境变量设置。    

                         $IFS:  文件记录分隔符, 将文件中每行的记录使用 $IFS 定义的变量进行分割。

                         $PWD:  当前所在目录。

                         $PS1, $PS2: Shell 提示符定制, 一级提示符及二级提示符。

                         $((EXPR)): 表达式计算; eg. echo $((1+2)) 。

                         ${cmd-replacement}: eg. 命令行结果替换, 效果类似 cmd-replacement | cat | 。 

                         $#:  命令行参数数目

                         $@: 命令行参数

                         $* : 命令行参数

                         $1-$9, ${10-...}: 取出指定命令行参数; $0: 脚本名称;

                         $? :  上次命令执行的状态码, 可判断上次命令是否成功, 0 表示成功; eg.  ls ; echo $? ;  ls notExist ;  echo $?

                         $$ :  脚本运行的当前进程ID号

                         [ ]: 取索引的相应值 

                         &n: 在重定向中, n 是文件描述符。

                          .  当前目录 ;  ..  上级目录

               (4) 控制结构

                         条件语句: if cond then statement elif cond2 then statement2 ...  else statement3 fi;      

                         for 循环:   for var in $@  do ... done  ;   

                         变量替换:  ${varname:-word}, ${varname:=word}, ${var#pattern} , ${var##pattern}, ${var%pattern}, ${var%%pattern} ,  

                         switch-case:   case $var in patt1-N)  dosome ;;  esac ;  

               (5) 内置命令

                         任选一个使用  man 命令可查看所有内置命令的解释           

                         set/unset: 设置/取消变量值 ;

                         readonly: 设置变量值为只读 ;

                         printf: 打印内容到控制台 ;

                         getopts: 命令行解析 ;

                         exit: 退出程序 ;

                         test:条件测试 ;

                         eval: 计算表达式的值 ;

                         sleep:  休眠若干秒 ;

                         trap: 捕获信号 ;

                         type: 内置命令; 使用 man type 可以看到所有内置命令的权威解释;

                       shift: 数组移动 ;

                       exec ;   执行指定命令;

                       at:   任务延迟执行;

            (6)   重要文件:

                        /proc/pid :  进程相关信息;

 


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

 

             (4)    grep 'inconsistency' log.txt | cut -f 3 -d":" | sed "s/ //g"   

                     从文本中截取感兴趣的文本(订单号)。 grep 先通过文本模式过滤出含有感兴趣文本的行; cut 剪切出指定的感兴趣的文本段; sed 去掉空格。

 

                     log.txt

                    日志概况: 2019-10-16 02:51:45 host/10.19.89.203 warn
                    日志内容: uuid  c.y.t.t.delay_compare-task - state-inconsistency: E20191016024042035800001

                     

              引用: 

                  1.  《Linux特殊符号大全》

           

posted @ 2012-09-15 10:33  琴水玉  阅读(381)  评论(0编辑  收藏  举报