2017-04-26 43 views
0

我有一个来自Hive的输出。我将该输出存储在名为match的变量中。来自Hive输出日志的结果

我使用下面的命令将我需要的行从日志中隔离出来。

echo $(echo $match | grep "COUNT_TOTAL_MATCH") 

0: jdbc:hive2://hiveaddress> . . . . . . . . . . . . . . . . . . . . . . .> +--------------------+-------+--+ | stats | _c1 | +--------------------+-------+--+ | COUNT_TOTAL_MATCH | 1000 | +--------------------+-------+--+ 0: jdbc:hive2://hiveaddress> 0: jdbc:hive2://hiveaddress> 

如何抢1000值知道它可以是任何其他的号码吗?

+0

什么是你的grep版本?它支持'-P'吗? – Sundeep

+0

Grep 2.6.3。它支持'-P' – nickfrenchy

+0

也,我会建议'echo“$ match”| grep'COUNT_TOTAL_MATCH''而不是你的代码... [引用变量](https://unix.stackexchange.com/questions/131766/why-does-my-shell-script-choke-on-whitespace-or-other -special-characters/131767#131767)并使用单引号除非你需要它被shell解释... – Sundeep

回答

1

尝试

grep -oP 'COUNT_TOTAL_MATCH\h*\|\h*\K\d+' 
  • \h*\|\h*可选的空间/ /制表随后|后跟可选空间标签
  • \K是正回顾后...所以只有当COUNT_TOTAL_MATCH\h*\|\h*匹配
    • \d+获得数字

man grep

-o, --only-matching 
      Print only the matched (non-empty) parts of a matching line, with each such part on a separate output 
      line. 

    -P, --perl-regexp 
      Interpret the pattern as a Perl-compatible regular expression (PCRE). This is highly experimental and 
      grep -P may warn of unimplemented features. 
2

你可以把|(空间管空间)作为域分隔符和打印第六场,就像这样:

awk -F ' \\| ' '{ print $6 }' 

注意,管has to be escaped twice


旁注:

echo $(echo $match | grep "COUNT_TOTAL_MATCH") 

可以改写为

grep 'COUNT_TOTAL_MATCH' <<< "$match" 

没有echo,没有管道,并在$match没有分词。 echo "$(command)"总是和command一样。 (请注意,报价有差别,虽然)。

这意味着,你可以结合你的grep和awk命令到这一点:

awk -F ' \\| ' '/COUNT_TOTAL_MATCH/ { print $6 }' <<< "$match"