AWK,在每列奇怪行为之前添加文本

时间:2015-05-31 09:21:35

标签: linux bash awk

我需要在每列之前添加不同的文本,并且我正在使用此命令:

top -b -n1  | tail -n +8 | grep -v top | head -6 | awk 'BEGIN { OFS = "\t" } $1 = "pid=" $1, $2 = "user=" $2' | awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0; fflush(); }'

这样可行,但如果我添加另一列:

top -b -n1  | tail -n +8 | grep -v top | head -6 | awk 'BEGIN { OFS = "\t" } $1 = "pid=" $1, $2 = "user=" $2, $9 = "cpu=" $9' | awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0; fflush(); }'

我收到错误:

awk: linea com.:1: BEGIN { OFS = "\t" } $1 = "pid=" $1, $2 = "user=" $2, $9 = "%cpu=" $9 awk: linea com.:1:                                 ^ syntax error

语法错误在“$ 2”之后的“,”上。

我不明白为什么。命令的完整输出(不在每列之前添加文本)是例如:

2015-05-31 11:16:08 1589 root 12,4 2,2 Xorg

2015-05-31 11:16:08 3 root 6,2 0,0 ksoftirqd/0

2015-05-31 11:16:08 1 root 0,0 0,1 init

2015-05-31 11:16:08 2 root 0,0 0,0 kthreadd

2015-05-31 11:16:08 5 root 0,0 0,0 kworker/0:0H

2015-05-31 11:16:08 7 root 0,0 0,0 rcu_sched

我需要这样的结果:

2015-05-31 11:16:08 1589 root 12,4 2,2 Xorg

2015-05-31 11:16:08 pid=3 user=root %cpu=6,2 %mem=0,0 command=ksoftirqd/0

2015-05-31 11:16:08 pid=1 user=root %cpu=0,0 %mem=0,1 command=init

2015-05-31 11:16:08 pid=2 user=root %cpu=0,0 %mem=0,0 command=kthreadd

2015-05-31 11:16:08 pid=5 user=root %cpu=0,0 %mem=0,0 command=kworker/0:0H

2015-05-31 11:16:08 pid=7 user=root %cpu=0,0 %mem=0,0 command=rcu_sched

直到列用户才能运行。有谁可以帮助我吗? 非常感谢

2 个答案:

答案 0 :(得分:2)

  

语法错误在“$ 2”之后的“,”上。我不明白为什么。

因为出现在同一行的多个命令需要由;而不是,分隔。 (查看手册会有所帮助)

但是,您目前正在使用许多工具完成可以使用awk完成的任务。您可以使用单个awk命令:

top -b -n1 |\
  awk 'NR>7&&!/top/&&c++<6{$1= "pid=" $1;$2= "user=" $2;print strftime("%Y-%m-%d %H:%M:%S"), $0}' OFS='\t'

更好地解释为多行脚本:

    NR>7           # Skip the first 7 lines     
&&  !/top/         # Skip lines containing the term 'top'
&&  c++<6   {      # Limit output to 6 lines

    $1= "pid=" $1  # Fix pid field
    $2= "user=" $2 # Fix user fields

    # Print the modified line with a timestamp in front of it
    print strftime("%Y-%m-%d %H:%M:%S"), $0
}

答案 1 :(得分:1)

pattern部分from, till表示range

它的工作方式&#34; (=在语法上是正确的,并没有导致错误)两个值。

您要在匹配的行上执行的命令称为actions,您应该将它们放在花括号中:{ ... }

{ $1 = "pid=" $1; $2 = "user=" $2; $9 = "cpu=" $9; print }