我有几个包含大型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" *
答案 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");