使用Bash从文件中提取整个Java语句
我有几个包含大型Java文件的目录,我想取出所有日志消息。这包括log.error、.info等。通常,它们看起来像这样:使用Bash从文件中提取整个Java语句,java,regex,bash,grep,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]); 有没有一种方法可以使用
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" *
尝试:
作为一个例子,让我们考虑这个测试文件:
$ 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");
这是通过查找包含记录器的行
并打印从那里到包含的第一行的每一行来实现的代码>
正如亨利在评论中指出的那样,像这样的正则表达式算法不是万无一失的。但是,如果你只是为了目视检查,这应该是一个好的开始
如果还要记录文件名和行号:
$ 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");
这是否用于从发布版本中删除日志调用?还是出于其他原因要获取日志行?如果是为了删除日志调用,那么使用像proguard这样的工具,它已经设计好了。总会有不起作用的情况。正则表达式不是用于编程语言解析的合适工具。我将它用于分析目的。我想确保不同模块和不同文件中的所有消息都是一致的。而且我不是regex专业人士,所以我不知道是否有我忽略的解决方案。我想这不会很漂亮的!
$ 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");