如何选择shell输出的最后一行

时间:2018-03-08 15:55:38

标签: bash shell awk sed

嗨,我有这样的shell命令。

s3=$(awk 'BEGIN{ print "S3 bucket path" }
 /Executing command\(queryId/{ sub(/.*queryId=[^[:space:]]+: /,""); q=$0 }
 /s3:\/\//{ print "," $10 }' OFS=',' hive-server2.log)

上述命令的输出就像这样。

echo $s3

2018-02-21T17:58:22,
2018-02-21T17:58:26,
2018-02-21T18:05:33,
2018-02-21T18:05:34

我想只选择最后一行。我需要像这样的最后一个输出。

 2018-02-21T18:05:34

我试过这样。

awk -v $s3 '{print $(NF)}' 

不工作。非常感谢。

3 个答案:

答案 0 :(得分:3)

通常,command | tail -n 1打印command输出的最后一行。但是,如果command的格式为awk '... { ... print something }',则可以重构为awk '... { ... result = something } END { print result }',以避免产生单独的进程,只是为了丢弃其他输出。

如果您已将结果存储在shell变量s3中,并且只想打印最后一行,则参数展开echo "${s3##*$'\n'}"会执行此操作。用于表示换行符的C风格字符串$'\n'是Bash扩展名,用于删除最长匹配前缀的参数扩展运算符##也不是完全可移植的,因此您应该确保shebang line说#!/bin/bash,而不是#!/bin/sh

另请注意,除非您明确要求shell对值执行空白标记化和通配符扩展,否则不带引号的$s3是错误的。你基本上应该always use double quotes around variables except in a couple of very specific scenarios.

答案 1 :(得分:0)

您好,只需添加echo $s3 | sed '$!d'

即可
s3=$(awk 'BEGIN{ print "S3 bucket path" }/Executing command\(queryId/{ sub(/.*queryId=[^[:space:]]+: /,""); q=$0 } /s3:\/\//{ print "," $10 }' OFS=',' hive-server2.log)

echo $s3 | sed '$!d'

它只会打印: -

2018-02-21T18:05:34

希望这会对你有所帮助。

答案 2 :(得分:0)

另一种方法可以是,从最后处理文件并在第一次匹配后退出。

tac file | awk '/match/{print; exit}'