zoukankan      html  css  js  c++  java
  • [Shell]字符截取命令:cut, printf, awk, sed

    -------------------------------------------------------------------------------------------

    【cut命令】

      cut [选项] 文件

        -f 列号        ( --field 提取第几列 )

        -d 分隔符    ( --delimiter 按照指定分隔符分割列 )

      vi user.txt

      ( 行间分隔符为制表符Tab,cut的默认分割符是制表符 )

        

      

      

      提取系统的用户名和uid:

        cut -d ":" -f 1,3 /etc/passwd

      与grep组合使用:( 假设批量添加100个普通用户,或需要批量删除,那么需要提取普通用户的名字 )

        useradd user1

        useradd user2

        useradd user3

       ( 所有系统用户登录目录都是/sbin/nologin , 通过匹配/bin/bash 提取所有能登录的用户 , -v 取反选择不匹配root的行,再用cut匹配列提取用户名;把结果赋给变量,通过循环删除 )

        cat /etc/passwd | grep "/bin/bash" | grep -v "root" | cut -d ":" -f 1

      cut命令的局限:   

       ( 提取系统盘使用率 )

        df -h

        df -h | grep "sda3" | cut -f 5      # 只能匹配出行所有内容,因为分隔符是空格,不是Tab

        ​df -h | grep "sda3" | cut -d " " -f 5   # 无法匹配出想要的结果,因为分割符是严格匹配,如果实际内容分割符有两个空格,无法得出正确结果

      建议 man cut 查看系统手册,内容相对简单直观。 

    【printf】

      printf '输出类型输出格式' 内容

      输出类型:

          %ns:    输出字符串。n是数字,指输出几个字符

          %ni:    输出整数。n是数字,指输出几个数字

          %m.nf:输出浮点数。m和n是数字,分别指输出的整数位数和小数位数。如%8.2f代表共输出8位数,其中2是小数,6是整数。

      输出格式:

          a   :    输出警告声音

              :    输出退格键,也就是Backspace键

          f    :    清除屏幕

               :    换行

               :    回车,也就是Enter键

               :    水平输出退格键,也就是Tab键

          v    :    垂直输出退格键,也就是Tab键

      printf %s 1 2 3 4 5 6    # 把123456当成一个字符串输出,没有格式

      printf %s %s %s 1 2 3 4 5 6    # 把%s%s123456当做字符串输出,没有格式

      printf '%s ' 1 2 3 4 5 6    # 把1 2 3 4 5 6当做字符串输出,输出格式为空格

      printf '%s ' 1 2 3 4 5 6    # 输出格式为1个一行

      printf '%s %s %s' 1 2 3 4 5 6    # 把内容当做字符串三个为一组输出,1 2 34 5 6

      printf '%s %s %s ' 1 2 3 4 5 6    # 输出格式为3个一行

      printf '%s' $(cat user.txt)    # 输出文本内容为字符串

      printf '%s %s %s %s ' $(cat user.txt)  # 把文本内容格式化输出

      建议 man printf 查看可用的输出格式,和C的 printf 格式一样

    【awk】

      awk的标准输出命令是printf,默认分割符是空格或制表符。

      ( cut 命令不能在分割符是空格的字符串中截取列,只能是 制表符 或 具体的分割符;所以可以用 awk 替代 cut 。

      1. awk '条件1{动作1} 条件2{动作2} ...' 文件名

      ( 如果条件1,执行动作1;如果条件2,执行动作2 )

        条件(pattern):

            一般使用关系表达式作为条件

            x > 10    判断变量x是否大于10

            x>=10    大于等于

            x<=10    小于等于

        动作(Action)

          格式化输出

            流程控制语句

      

       awk '{printf $2 " " $3" "}' user.txt

       ( 大括号前面没有条件,直接执行命令,这里的printf 是awk的命令,$2 提取文件第二列,$3 提取文件第三列,$0 提取所有列 )

       df -h | awk '{print $1 " " $5 " " $6 " "}'

       ( 打印三列,这里的print是awk的命令,系统并没有print命令,所以只能在awk里使用;与printf的区别是:print会自动在行尾加换行符,而printf不会 )

       df -h | grep sda3 | awk '{print $5}' | cut -d '%' -f 1

         df -h | grep sda2 | awk '{print $5}' | awk -F% '{print $1}'    # awk 替代 cut 

       ( 提取系统已使用硬盘空间,可以把结果赋给一个变量,判断是否大于某个值,进行报警 )

         ps --ppid 109215 | awk '/[0-9]/ print $1'   # 打印子进程 id

      举一反三,查看剩余内存不包含单位M:free -h | grep Mem | awk '{print $4}' | cut -d 'M' -f 1 

      移除所有 image:docker rmi -f `docker images | grep MB | awk '{print $3}' | xargs`

      grep 取行,awk 按条件取指定列,cut 按分隔符取指定列。

      2. BEGIN:先执行一条多余的动作

       awk 'BEGIN{print "this is a text"} {print $2 " " $3}' user.txt

      3. END:用于在所有命令处理完之后执行

      4. FS内置变量:用于定义分割符,如果需要手工定义分割符,一定要在分割符前面加BEGIN;

       awk 'BEGIN{FS=":"} END{print "this is end text"} {print $1 " " $3}' /etc/passwd     # 等同下面 -F 参数定义分隔符

         awk -F: 'END{print "this is end text"} {print $1 " " $3}' /etc/passwd      

      理解语言思路,在命令行中要进行这么多功能,怎样合理的安排就怎样设计,这样看来语法是很简洁的。

      BEGIN、END也是条件。

      5. 关系运算符:

       cat user.txt | grep -v ID | awk '$4 > 18 {printf $2 " "}'

       ( user.txt中不包含ID这行,提取满足条件为第四列值大于18的第二列 )

    【sed】

      sed是一种几乎包括在所有Unix平台的轻量级流编辑器(stream editor)。

      sed主要是用来将数据进行选取、替换、删除、新增的命令。(可以放在管道符之后处理)

      sed [选项] '[动作]' 文件名

        sed命令有两种形式:sed [options] 'command' file(s);sed [options] -f scriptfile file(s)

      

      选项:

          -n    :    一般sed命令会把所有数据都输出到屏幕;如果加入此选项,则只会把经过sed命令处理的行输出到屏幕。

          sed -n '2p' user.txt    # 输出第二行

          -e    :    允许对输入数据应用多条sed命令编辑

        -f    :  添加脚本文件的内容到执行的动作

          -i    :    用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出

      动作:(要加双引号)

          a    :    追加,在当前行后添加一行或多行。添加多行时,除最后一行外,每行末尾需要用""代表数据未完结。

          c    :    行替换,用c后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾需要用""代表数据未完结。

          i    :    插入,在当前行前插入一行或多行。插入多行时,除最后一行外,每行末尾需要用""代表数据未完结。

          d    :    删除,删除指定的行。

          p    :    打印,输出指定的行。

          s    :    字串替换,用一个字符串替换另外一个字符串。格式为“行范围s/旧字串/新字串/g”(和vim中的替换格式类似)

      sed -n '2p' user.txt        # 输出第二行, p一般都要和-n使用,不加-n会显示出所有的行

      df -h | sed -n '2p'          # 管道符结果作为操作内容

      sed '2,4d' user.txt        # 删除文件的第2行到第4行,显示剩下的行,没有加 i 选项,不会更改文件内容

      sed '2a hello' user.txt      # 在第二行后追加hello,仅仅修改命令输出

      sed '2i hello

        world' user.txt        # 在第二行前插入两行数据,仅仅修改命令输出

      sed '2c No person' user.txt    # 把第二行替换为No person

      sed '2s/M/F/g' user.txt      # 把第二行的M替换为F后输出

      

      sed -i '2s/M/F/g' user.txt  # 把替换后的结果写入文件

      sed -e 's/zhang//g ; s/wang//g' user.txt    # -e允许多条命令顺序执行,用分号隔开,s前面不加数字表示所有行

    Link: http://www.cnblogs.com/farwish/p/4806018.html

  • 相关阅读:
    小白学编程,C++ 初始化的坑,你避开了吗?
    学完C语言还是懵的?大学生:我可能学了个假的C语言
    不知道如何入门编程?最全在线教程网站汇总来了,还不赶快收藏
    Linux 之父对 C++ 进行了炮轰,C++不值得推荐?
    没有内存泄漏的C++代码,如何用RAII编写,你知道吗
    菜鸟学编程,不懂C++ this指针?还不赶快来学一学
    在7天-第2天逐步学习MVC(模型视图控制器)
    ASP。NET MVC vs ASP。NET WebForm性能比较
    学习MVC项目在7天-奖金的第二天
    学习MVC项目在7天-奖金的第一天
  • 原文地址:https://www.cnblogs.com/farwish/p/4806018.html
Copyright © 2011-2022 走看看