如何使用awk打印剩余的列?

时间:2016-02-11 01:47:21

标签: bash awk

现在我有一个命令可以打印我的日志文件,每列有一个分隔的|

cat ambari-alerts.log | awk -F '[ ]' '{print $1 "|" $2 "|" $3 "|" $4 "|" $5 "|"}' |
grep "$(date +"%Y-%m-%d")"

日志文件数据的样本是:

2016-02-11 09:40:33,875 [OK] [MAPREDUCE2] [mapreduce_history_server_rpc_latency] (History Server RPC Latency) Average Queue Time:[0.0], Average Processing Time:[0.0]

我的命令结果如下:

2016-02-11|09:40:33,875|[OK]|[MAPREDUCE2]|[mapreduce_history_server_rpc_latency]

我想打印剩余的列。我怎样才能做到这一点?我尝试添加$0语法,但不幸的是它只是再次打印整行。

awk -F '[ ]' '{print $1 "|" $2 "|" $3 "|" $4 "|" $5 "|" $0}'

希望你能帮我,新手在这里使用awk。

3 个答案:

答案 0 :(得分:3)

这似乎就是你所需要的:

$ awk '{for (i=1;i<=5;i++) sub(/ /,"|")} 1' file
2016-02-11|09:40:33,875|[OK]|[MAPREDUCE2]|[mapreduce_history_server_rpc_latency]|(History Server RPC Latency) Average Queue Time:[0.0], Average Processing Time:[0.0]

答案 1 :(得分:0)

这对awk来说有点麻烦

awk -F '[ ]' '{
    printf "%s|%s|%s|%s|%s|", $1, $2, $3, $4, $5
    for (i=6; i<=NF; i++) printf "%s ", $i
    print ""
}'

或者,替换前5个空格:

awk -F '[ ]' '{
    sub(/ /, "|");sub(/ /, "|");sub(/ /, "|");sub(/ /, "|");sub(/ /, "|")
    print
}'

这在bash中实际上更容易

while IFS=" " read -r a b c d e rest; do
    echo "$a|$b|$c|$d|$e|$rest"
done < file.log

在你的grep中折叠:

awk -F '[ ]' -v date="$(date +%Y-%m-%d)" '{
    $0 ~ date {
        printf "%s|%s|%s|%s|%s|", $1, $2, $3, $4, $5
        for (i=6; i<=NF; i++) printf "%s ", $i
        print ""
    }
}'

答案 2 :(得分:0)

这里有一些awk提供了一种比粗暴强制前5列更通用的方法:

awk '{
      for (i = 1; i < 6; i++)
        printf "%s|", $i
      for (i = 6; i < NF; i++)
        printf " %s ", $i
      }' ambari-alerts.log | grep "$(date +"%Y-%m-%d")"