本篇博客将介绍linux系统中比较常用的 bash 以及用法,例如被称为Linux系统中的"三剑客"--grep , sed , awk ; 还有cut ,seq , sort , wc , uniq , diff ,通配符等 .

 

     在Linux系统中查找文件一般都会用到通配符 , 管道  , bash技巧命令来输出我们想要得到的结果 , 首先我们先了解通配符的作用:


 一 . 通配符


     作用 : 是用来在文件搜索时代替文件名中的一个或多个正真字符 .

     常用通配符符号有 : ?  *  []

     

     ?  作用 : 匹配任意单个字符 .

     例 : ls  /dev/tty?  , 输出的结果为 /dev/tty 加任意一个字符 , 如图 :

     Shell(5)-linux系统bash用法_grep

     再尝试使用命令 ls /dev/tty?? , 结果为 : 

     Shell(5)-linux系统bash用法_linux_02


     *  作用 : 匹配任意0个或多个字符 , 意为所有 

     例 : ls  /dev/tty*

     Shell(5)-linux系统bash用法_bash_03

     同理 , ls  /etc/*.conf , 输出的结果为显示目录 /etc 下的所有以conf结尾的文件 , 这里不做尝试 .


     []  作用 : 匹配[]中的任意单个字符

     例 : ls  /dev/tty[123]5

     Shell(5)-linux系统bash用法_sed_04

     也可以连续一个范围进行匹配 , 如 ls  /dev/tty[1-6]5

     Shell(5)-linux系统bash用法_grep_05


     管道符 |  :将前一个命令的结果(标准输出) 传给后一个命令继续处理 

     例 : head -6  /etc/passwd  |  cat  -n    #查看文件/etc/passswd的前6行 后, 再用cat查看显示行号

      Shell(5)-linux系统bash用法_sed_06

      说明 : 管道符可以一个接着一个 , 例在上面的例子上再输出前3行信息

      Shell(5)-linux系统bash用法_grep_07




 二 . Linux系统三剑客其二(grep , sed )入门 

       

     awk用法见博客 :https://blog.51cto.com/14181896/2359808

     1 . grep : 匹配关键字 , 显示文件中关键字所在的整行内容


     例 : grep  root  /etc/passwd         #显示/etc/passwd文件中所包含root关键字的行

     Shell(5)-linux系统bash用法_bash_08


     常用选项 :  -n         显示行号

                       -i          不区分大小写

                       -v         取反

                       -c         带关键字的函数

                       -n         静默执行 , 不在屏幕显示匹配到的内容 , 通常用于shell脚本

      更多选项用法可以用 grep  --help 查看用法



     2 . sed流编辑器

          是一种文本编辑器 , 默认情况下是不会修改原文件的 , 也是一种非交互式的编辑器

          工作原理 : 一行一行处理文件 , 当从文件中读取一行后 , 首先放到模式空间(内存缓冲区)匹配关键字进行相应的处理 , 处理完将结果输出到屏幕上 , 接着处理下一行内容 , 直到所有行都读取完毕 , sed 结束 .


     sed的语法 :   sed  [option] '地址命令'  文件名

     常用选项 :  -n   静默输出 , 关闭模式空间的输出 , 不会输出未匹配到的行

                      -e   允许进行多项编辑 , 应用于对同一行做多次处理 , -e  "命令1"  -e  "命令2" ..-e "命令n"

                      -f    后接sed脚本 , 指定执行的sed脚本

                      -r    允许使用扩展正则

                      -i     直接作用于原文件


     sed 地址定址 :

     定址用于决定对哪些行进行编辑 , 地址形式可以是数字 , 正则表达式或二者结合 . 如果没有指定地址 , sed将处理输入文件中的所有行 .


     例 : 文件准备 , 将/etc/passwd文件中的前10行内容添加行号覆盖写入/pass文件中 , 然后查看/pass文件中的内容

           Shell(5)-linux系统bash用法_bash_09

           

           输出单行 :

           sed  -n  '1p'  /pass     #显示/pass文件中的第一行 ,1p 指print 第1行

           Shell(5)-linux系统bash用法_grep_10

           同理 , 输出/pass文件第5行 :

           Shell(5)-linux系统bash用法_sed_11

         

           输出指定的多行 : 

           Shell(5)-linux系统bash用法_linux_12

           指定行数 , 行数号与行数号之间用逗号隔开


           打印从i行开始的后几行 (i,+n)

           Shell(5)-linux系统bash用法_bash_13


           打印从第1行开始 , 再加上n行为止 

           Shell(5)-linux系统bash用法_linux_14

        

           关键字匹配: 处理符合模式(匹配关键字)的行 , -r 表示启用正则表达式

           例 : 显示/etc/passwd文件中以root开头的内容

           Shell(5)-linux系统bash用法_bash_15


    sed的子命令 : 

    sed的子命令告诉sed对指定行进行何种操作 , 包括打印p , 删除d , 修改(追加a , 插入i , 替换s , 字符替换c)

   

     将/etc/passwd这个文件前10行导入新文件/pass1:   head  /etc/passwd  >  /pass1

           

          d : 删除(delete)

          sed  '/^root/d'  /pass1     处理/pass1文件显示删除以root开头的行号 

          Shell(5)-linux系统bash用法_bash_16


          i : (i\text) 在符合模式的行的上面插入(insert)\以后的text文本 , 结果将在终端上显示 , 默认不会改变原文件

          sed '/^root/i\hello'  /pass1  

          Shell(5)-linux系统bash用法_sed_17      


          a : (a\text) 在符合模式的行的下面追加\以后的text文本 , 处理结果同 i

          Shell(5)-linux系统bash用法_linux_18

          结合上面两个例子 , 使用 -e 选项 同时执行 , 结果如图所示 :

          Shell(5)-linux系统bash用法_sed_19


         c : (c\text) 用新文本覆盖符合模式的行中的文本

         例 : 用 hello world 覆盖/pass1文件中的第 2 行

         Shell(5)-linux系统bash用法_sed_20


         s : 用一个字符替换另一个字符

         例 : sed  's/root/ROOT/g'  /pass1    #指定替换所有匹配到的

         Shell(5)-linux系统bash用法_grep_21

         sed  's/root/ROOT/2'  /pass1    #指定替换匹配到的的第二个

         Shell(5)-linux系统bash用法_sed_22




     cut命令 : 提取文件中指定的字段 , 字符内容 . 默认分隔符为空格

     

     格式 :  cut  [选项]..  [文件]..

     常用选项 :  -b   按照字节切 , utf-8编码中每个汉字占三个字节(好比4个汉字就取得12个字节)

                      -c    按照字符切

                      -d    指定分隔符

                      -f     指定以分隔符分割的哪个字段


     实例 :  将 /etc/passwd 文件中的前5行覆盖写入/pass 文件中( head  -5  /etc/passwd  > /pass)

                显示/pass文件中以 : 分隔的第6行内容 , 家目录内容:

                Shell(5)-linux系统bash用法_linux_23

                显示/pass文件中的第一列(用户名)和第7列(shell解释器)的内容:

                Shell(5)-linux系统bash用法_grep_24

                同理 : cut  -d :  -f  1-3  /pass    取1~3列内容

                以字符大小切 , 例 :echo '×××' | cut  -b  1-12

                Shell(5)-linux系统bash用法_bash_25

        



     seq : 按顺序打印出一些数字 , 例如: 1 2 3 4 5 ...

      

     用法 :  seq  [选项]  ...尾数

               seq  [选项]  ... 首数  尾数

               seq  [选项]  ...首数  增量  尾数


      实例 :  seq  5       #按顺序输出1~5的数

               Shell(5)-linux系统bash用法_grep_26

               同理 : seq  5~10     #按顺序输出5~10的数    

                         seq  1  2  10    #输出1~10之间的奇数

                         seq  10  -1  0    #输入10~0之间的数

               补齐输出 : -w   例 : seq  -w  1  50  200

               Shell(5)-linux系统bash用法_grep_27

       扩 : 使用echo命令也能实现seq同样的效果 , 格式 echo {首数..尾数..增量}


 

     sort排序 : 排序分为升序 和 降序 , 默认是按升序进行排列


     常见选项 : -n  (--numeric--sort)   根据数值比较 , 默认是按单个字符来比较

                     -r   逆序输出排序结果

                     -t   指定分割符

                     -k   排序键(key , 即排序的列字段)

                     -u   去掉重复行

      实例 : seq 1 10 | sort 

               Shell(5)-linux系统bash用法_grep_28

               seq  1  10 | sort -n

               Shell(5)-linux系统bash用法_grep_29

               seq  1  10 | sort - nr

               Shell(5)-linux系统bash用法_grep_30

               sort  -t :  -k  2  -n  文件名    #按 : 分割开的以第2列是数值大小排序 (使用的最多)

               例 : 按/etc/passwd 文件中第3列uid数值大小进行排列

               Shell(5)-linux系统bash用法_linux_31


     

     wc : 统计行数 , 单词数 , 字节数

     例 : wc  /etc/passwd    #在/etc/passwd这个文件中有45行 , 92个单词数 , 2356个字节

           Shell(5)-linux系统bash用法_linux_32

           wc  -l    统计行数

           Shell(5)-linux系统bash用法_bash_33

           wc  -c  统计字节数

           Shell(5)-linux系统bash用法_grep_34

           wc  -m  统计单词数

           Shell(5)-linux系统bash用法_bash_35

           统计 /bin 目录下有多少个命令

           Shell(5)-linux系统bash用法_bash_36


         

     uniq : 合并连续重复的行 


     常用选项 :  -u    只显示没有连续重复的行

                      -c     统计连续重复行的次数

                      -d    只显示连续重复行一次 , 哪一行连续重复了就显示哪行

                      -i     忽略大小写


     例 : 准备一个文件 a.txt , 在文件输入内容并查看a.txt如图所示 :

           Shell(5)-linux系统bash用法_bash_37

           uniq  -c  a.txt     #统计连续出现的次数

           Shell(5)-linux系统bash用法_sed_38

           uniq  a.txt    #对a.txt 文件中连续重复的行只显示一次

           Shell(5)-linux系统bash用法_linux_39

           uniq  -u  a.txt      #不显示连续重复的行

           Shell(5)-linux系统bash用法_linux_40

           uniq  -d  a.txt    #仅显示连续出现的内容一次

           Shell(5)-linux系统bash用法_sed_41

           结合sort排序使用 , 显示没有重复的行

           Shell(5)-linux系统bash用法_grep_42

 



    diff 命令 : 

    vimdiff  : 比较两个文件的差异

     

     实例 : 准备两个存在差异的文件 : 

              head  -3  /etc/passwd  >  /tmp/pass3

              head  -5  /etc/passswd > /tmp/pass5

               准备好上面两个文件之后 ,先使用vimdiff 对比/pass3 和 /pass5的文件内容 , 再用diff命令对比两个文件的差异 , 将显示出两个文件不同内容:

               Shell(5)-linux系统bash用法_linux_43

               Shell(5)-linux系统bash用法_sed_44

               

               通过显示差异 , 可以制作补丁 : 

               diff  /pass3  /pass5  >  /pass35.patch   #制作补丁文件/pass35.patch(增加内容) 并查看此文件 :

               diff  /pass5  /pass3  >  /pass53.pattch   #制作补丁文件/pass53.patch(减少内容)

               Shell(5)-linux系统bash用法_sed_45

               

               patch 打补丁 : 

               首先安装patch -- yum  install  -y  patch ,然后给/pass3 文件打补丁 , 最后查看/pass3文件内容 :

               Shell(5)-linux系统bash用法_bash_46

               同理 patch  /pass3  /pass53.patch  会减少/pass3的最后两行



    tr : 替换字符 , 被替换的字符与替换的字符数必须是相等的

    用法 : tr   旧字符   新字符


    实例 : 准备一个文件 b.txt , 内容如图 :

             Shell(5)-linux系统bash用法_linux_47

              

             cat  b.txt | tr  20  89     #将cat  b.txt 结果中的20 替换成了 89(不改变原文件)

             Shell(5)-linux系统bash用法_grep_48

             cat  a.txt | tr  "a-z" "A-Z"   #替换时一一替换 , 字母变成大写

             Shell(5)-linux系统bash用法_sed_49

  



      以上都是比较常见的 bash 和 它们的用法 , 下一篇再介绍 awk 的简介作用以及它的入门操作