当前位置: 首页 > 面试题库 >

如何在Java中通过exec使用管道符号

邵阳德
2023-03-14
问题内容

我正在使用以下代码来获取系统中正在运行的所有进程的详细信息:

Process p = Runtime.getRuntime().exec("ps aux");
BufferedReader stdInput = new BufferedReader(new 
             InputStreamReader(p.getInputStream()));
BufferedReader stdError = new BufferedReader(new 
             InputStreamReader(p.getErrorStream()));

我想ps aux用管道符号过滤掉,所以我用这个:

Process p = Runtime.getRuntime().exec("ps aux | grep java");

转到ErrorStream。后来我注意到管道符号(|)在Java中用作按位包含或运算符。所以我在管道符号前面使用了反斜杠,如下所示:

Process p = Runtime.getRuntime().exec("ps aux \\| grep java");

但是,它再次进入ErrorStream。如何ps aux | grep java在Java中执行exec?


问题答案:

管道是shell的功能-您没有使用shell,而是在执行进程(ps)。

但实际上,您为什么要这样做?您的意思是:

“执行ps,然后将其输出通过管道传送到另一个程序(grep),并提取我需要的内容”

您只需要从的输出中提取想要的内容即可ps。使用Matcher,只注意java您的InputStream

http://download.oracle.com/javase/6/docs/api/java/util/regex/Matcher.html



 类似资料:
  • 问题内容: Java官方文档指出: 它打印: 这与我的预期相去甚远: 为什么会这样呢? 问题答案: 你需要 使用正则表达式,并且在中 |是表示OR运算符的元字符。你需要使用来转义该字符\(使用String编写,因为它也是String文字中的元字符,并且需要另一个字符来对其进行转义)。 你也可以使用 并创建代表的正则表达式的转义版本|。

  • Java官方文档说明: 例如,字符串使用以下表达式Regex Result生成以下结果: 这就是我需要它工作的方式。然而,如果我运行这个: 它打印: 这与我的预期相去甚远: 为什么会这样?

  • 可以在jenkins管道共享库中导入和使用常规java库吗?我想导入AWS SDK for java,并在管道代码中直接使用它。我必须将其添加到共享库的src dir中吗?

  • 问题内容: 在Linux终端中,当一个命令的输出太长而无法在一页中读取时,我可以这样做: 这样我就可以读取cat文件的输出并上下滚动。 如何在IPython中执行此操作? 例如,我尝试了一下,但没有成功: 我最初的问题是通过Shift + Page Up不能看到来自的输出,并且我不想更改滚动缓冲区。 问题答案: 在IPython中,您可以使用标准的寻呼机(通常是)来显示对象。另外,您可以增加终端的

  • 问题内容: 我知道如何使用写输出(中)到,同时还在终端显示它: 现在如何在仍然显示文件的同时写入名为的文件? 问题答案: 我假设您仍然想在终端上看到STDERR和STDOUT。您可以寻求Josh Kelley的答案,但我发现在后台保留一些内容,这会使您的日志文件非常骇人且笨拙。请注意,您需要保留一个exra FD并随后通过杀死它来进行清理,从技术上讲,应该在.NET中执行此操作。 有一种更好的方法

  • 问题内容: 我必须编写一个可以运行管道的外壳。例如“” 这样的命令。我已成功解析了用户给出的命令,如下所示: “ ls” = firstcmd “ -l” = frsarg “ wc” = scmd “ -l” = secarg 现在,我必须使用两个fork,因为命令分别是两个和一个管道。我为执行命令编写的代码块如下: 因此,当我运行外壳程序并输入命令(例如)时,执行程序的结果不会显示,但外壳程序