• Linux命令 awk


    $ awk '条件类型 1{动作 1} 条件类型 2{动作 2} ...' filename  # awk 后面接两个单引号并加上大括号{} 来设定想要对数据进行的操作。

    $ cat awk_file | awk '{print $1 " " $3}'  # 非变量部分需要使用双引号来括住。

     1 $ cat awk_file 
     2 dmtsai    pts/0    192.168.1.100    Tue Jul 14 17:32   still logged in
     3 dmtsai    pts/0    192.168.1.100    Thu Jul  9 23:36 - 02:58  (03:22)
     4 dmtsai    pts/0    192.168.1.100    Thu Jul  9 17:23 - 23:36  (06:12)
     5 dmtsai    pts/0    192.168.1.100    Thu Jul  9 08:02 - 08:17  (00:14)
     6 dmtsai    tty1                      Fri May 29 11:55 - 12:11  (00:15)
     7 $ cat awk_file | awk '{print $1 "	" $3}'
     8 dmtsai    192.168.1.100
     9 dmtsai    192.168.1.100
    10 dmtsai    192.168.1.100
    11 dmtsai    192.168.1.100
    12 dmtsai    Fri

    结果最后一行出现了问题。所以在使用awk时,需要事先确认数据,如果是连续性数据,不能有空格或tab在内。

    在awk括号内,每行的每个字段都有变量名称,即$1、$2...;非变量部分需要使用双引号来表示。

    $ cat awk_file | awk '{print $0}'  # 整行

    批量杀死进程:

    sudo ps -ef | grep python | grep -v 'grep' | awk '{print $2}' | xargs kill -9

    NR:当前处理的是第几行

    NF:每行有几个字段

    FS:目前的分隔符,默认为空格

    1 $ cat awk_file | awk '{print $1 "	 lines: " NR "	 column: " NF}'
    2 dmtsai     lines: 1     column: 10
    3 dmtsai     lines: 2     column: 10
    4 dmtsai     lines: 3     column: 10
    5 dmtsai     lines: 4     column: 10
    6 dmtsai     lines: 5     column: 9

    awk的逻辑运算符

    passwd文件以':'为分隔符,

    第一行没有正确显示。这是因为当读入第一行时,变数$1、$2... 默认还是以空格为分隔符的,所以虽然定义了FS=":",却只能在第二行后才开始生效。

    解决方法:BEGIN

    $ cat passwd | awk 'BEGIN {FS=":"} $3 < 10 {print $1 " " $3}'

    awk实现计算功能:

    第1行只是说明,不参与运算(NR==1时不处理)

    第2行以后参与运算(NR>=2时处理)

    $ cat pay.txt | awk 'NR==1{printf "%10s %10s %10s %10s %10s ", $1, $2, $3, $3, "total"}  # Enter键
    > NR>=2{total = $2 + $3 + $4  # Enter键
    > printf "%10s %10d %10d %10d %10.2f ", $1, $2, $3, $4, total}'

    如果有多个指令需要执行(例如,上面的total和printf),可用 ';' 或Enter 分开。

    与bash shell 的变量不同,在awk中,变量可以直接使用,不需加$ 符号(例如,total)。

    awk括号内,也支持if语句

    $ cat pay.txt | awk '{if(NR==1) printf "%10s %10s %10s %10s %10s ", $1, $2, $3, $3, "total"}
    > NR>=2{total = $2 + $3 + $4
    > printf "%10s %10d %10d %10d %10.2f ", $1, $2, $3, $4, total}'

    awk也支持循环计算,这一部分参考扩展阅读部分。

  • 相关阅读:
    基于注解的mybatis(转)
    git分支删除
    java多线程同步(转)
    hadoop学习笔记(五):java api 操作hdfs
    java常用设计模式一:单例模式
    mysql CONCAT用法
    mysql date_sub用法
    hadoop学习笔记(四):hdfs常用命令
    try-catch+thows异常范围说明
    Python 类的多态
  • 原文地址:https://www.cnblogs.com/yangxiaoling/p/10552329.html
Copyright © 2020-2023  润新知