使用Bash将整个Java语句从文件中拉出

时间:2016-07-20 17:20:09

标签: java regex bash grep

我有几个包含大型Java文件的目录,我想提取所有日志消息。这包括log.error,.info等。通常,它们看起来像这样:

logger.error("some message here");

问题是其中一些消息包含换行符,因此grep没有收到完整的消息:

logger.debug("operation [" + j + "] = whatever " + ids[j] + 
" name: " + names[j] + " time: " + times[j]);

有没有办法可以使用正则表达式来获取整个Java语句,直到分号?

这是我到目前为止所做的:

grep -rn --include \*.java "\b\.error(\"\b" *

1 个答案:

答案 0 :(得分:2)

尝试:

find . -iname '*.java' -exec awk '/logger/,/;/' *.java +

举个例子,让我们考虑一下这个测试文件:

$ cat file.java 
some(text);
logger.debug("operation [" + j + "] = whatever " + ids[j] + 
" name: " + names[j] + " time: " + times[j]);
other(text);
logger.error("some message here");
more(text); 

让我们提取其记录器语句:

$ find . -iname '*.java' -exec awk '/logger/,/;/' {} +
logger.debug("operation [" + j + "] = whatever " + ids[j] + 
" name: " + names[j] + " time: " + times[j]);
logger.error("some message here");

这可以通过查找包含logger的行并将每行打印到包含;的第一行来实现。

正如Henry在评论中指出的那样,像这样的正则表达式算法并非万无一失。但是,如果您只是用于目视检查,这应该是一个良好的开端。

如果您还想记录文件名和行号:

$ find . -iname '*.java' -exec awk '/logger/,/;/{printf "%s:%s: %s\n",FILENAME,FNR,$0}' {} +
./file.java:2: logger.debug("operation [" + j + "] = whatever " + ids[j] + 
./file.java:3: " name: " + names[j] + " time: " + times[j]);
./file.java:5: logger.error("some message here");