shell编程-字符截取命令-awk命令

前言

  • awk标准输出就是printf命令。如下如这种情况下,用cut命令就不能解决,这是就需要awk命令来解决这个问题。
    在这里插入图片描述
  • awk的功能比cut的功能要强大的多。那为什么还要有cut命令那??? awk是一个非常复杂的命令,不光能实现字符段的截取,还可以在awk命令当中进行编程调用,最常用的是可以定义函数可以判断,可以调用流程控制等。当cut命令不能完成的时候再考虑awk。

1.awk命令

awk ‘条件1{动作1}条件2{动作2}...' 文件名
条件(pattern):
          一般使用关系表达式作为条件
          x > 10 判断变量x是否大于10
          x>=10 大于等于
          x<=10 小于等于

动作(Action):
         格式化输出
         流程控制语句

注意事项: 如果没有条件:不论任何条件,什么样的数据全部都执行这个动作。

举个栗子:

  • 命令: awk '{ printf $2 "\t" $6 "\n" }' student
    命令: df -h | awk '{ print $1 "\t" $3 }'
    在这里插入图片描述
    在这里插入图片描述
    注意事项:
    (1)这里的printf就不是系统命令存在了,而是awk当中动作的命令。 它的使用方法和系统当中的完全一样的。printf支持单引号也支持双引号。
    (2) 位置参数变量:$0代表着一整行(一整行数据都包括,而$1代表一行中的第一个数据),动作一行一行的处理,把所在的行都赋给$0~$6然后输出。
    (3) awk的基本操作不难,主要是编程部分比较难。

1.1 BEGIN的作用

再举个栗子:

  • 命令: awk 'BEGIN{ printf "This is a transcript\n" } {printf $2 "\t" $6 "\n"}' student
    BEGIN的作用:BEGIN是一个条件,只能满足条件动作才能执行。在所有的数据读取之前,执行动作,然后再执行后面的动作。
    在这里插入图片描述

1.2 END的作用

再举个栗子:

  • 命令: awk 'END{ print "The End " } {printf $2 "\t" $6 "\n"}' student
  • END的作用: 再命令执行完之后在执行一个动作。
    在这里插入图片描述

1.3 FS内置变量的作用

再举个栗子:

  • 命令: cat /etc/passwd | grep "/bin/bash" | awk 'BEGIN {FS=“:”} {printf $1 "\t" $3 "\n"}'
    FS的作用: 指定分隔符,awk默认识别的分隔符是制表符和空格,如果指定分隔符,就要用FS。
    在这里插入图片描述
    解决出现的问题: 为什么第一行没有处理那??? 因为再指定分隔符之前,第一行数据已经读入,然后处理就来不急了。所以这时候就要用到BEGIN来解决这个问题了, 这也是BEGIN最常见的应用场景。当读取第一行数据之前,就先把分隔符写进去。然后再来处理。如果手工定义分隔符,再分隔符之前加入BEGIN。
    在这里插入图片描述
    在这里插入图片描述

1.4 关系表达式作为条件

举个栗子:

  • 命令: cat student | grep -v Name | awk '$6>=87 {printf $2 "\n" }'
    作用: 在student文件(每行中的间隔以制表符作为间隔),提取出除Name行外的其他行,然后再判断每行的第六个字段是否大于等于87,如果等于然后把这行的第二个字段提取出来。
    在这里插入图片描述

2. 总结

  • 这里还没有涉及awk编程,在awk中可以实现函数调用,要想实现流程控制,完全可以用shell语言来是实现,再用awk来处理。没必要把awk弄得的这么复杂,只有在极端的情况下。
  • awk语言没有shell语言更直观。完全可以流程控制这些内容,靠shell来处理。处理完之后,由awk负责截取列就可以了。如果不打算深究awkb编程,学这么多完全足够了。
  • 也就是说,awk代码短小精悍,但是逻辑比较复杂。 而用shell的话,代码比较多,但是逻辑比较简单,通俗易懂。

猜你喜欢

转载自blog.csdn.net/weixin_46818279/article/details/107579524