【问题标题】:Linux awk command to retrieve first and last rowLinux awk 命令检索第一行和最后一行
【发布时间】:2019-11-04 13:24:27
【问题描述】:

我正在尝试检索 awk 命令的第一行和最后一行,但我做不到。我哪里出错了。

egrep 'updateAll|update-mgr|Startup REX|configd.*UnitProperty updated' $LOG | \
  awk 'NR == 1{print $1" "$2" "$3} NR == $#{print $1" "$2" "$3}'

awk: cmd. line:2: NR == 1{print $1" "$2" "$3} NR == $#{print $1" "$2" "$3}
awk: cmd. line:2:                                    ^ syntax error

我希望第一行和最后一行形成grep 命令的输出。

【问题讨论】:

  • $# 在 awk 中没有任何意义......如果它理解 bashism,它仍然不会做你想做的事。

标签: linux awk


【解决方案1】:

顺便说一句 - 大多数时候,当您在一个命令中使用 grep 和 awk 时,您做错了;)

awk '
{  
    if ($0~/updateAll|update-mgr|Startup REX|configd.*UnitProperty updated/) {
       c++
       l=$0
       if(c==1){print}       
    }
}
END{print l}
'  $LOG

【讨论】:

    【解决方案2】:

    使用NR == 1 获取第一行,使用END 获取最后一行。

    有这个输入:

    $ echo -e '1 a v\n2 b w\n3 c x\n4 d y\n5 e z'
    1 a v
    2 b w
    3 c x
    4 d y
    5 e z
    

    我们可以使用awk 命令解析它:

    $ echo -e '1 a v\n2 b w\n3 c x\n4 d y\n5 e z' | awk 'NR == 1 { print $2; } END { print $2; }'
    a
    e
    

    【讨论】:

      【解决方案3】:

      @tink 解决方案是正确的。我只想补充一点:。

      使用变量l 是不好的做法,因为根据当前字体,它可能会被误认为1I

      可以提取默认匹配模式作为过滤模式进行记录处理。

      所以@tink 解决方案变成:

      awk '
      /updateAll|update-mgr|Startup REX|configd.*UnitProperty updated/ {  
          c++;
          lastLine = $0;
          if(c == 1){print}       
      }
      END{print lastLine}
      '  $LOG
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-30
        • 2022-01-13
        • 1970-01-01
        • 2014-04-07
        • 2014-03-24
        • 2022-01-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多