嗨,我有这样的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)}'
不工作。非常感谢。
答案 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}'