grep在不期望的时候返回一个匹配

时间:2018-04-08 04:22:35

标签: linux unix grep

我正在运行一个抛出异常的java程序。我正在将run的输出传递给grep命令,我在这里检查一个不存在的模式,但grep会一直返回匹配。

commit --amend

我正在运行以下命令:

0,2,468.000000
1,2,305.000000
2,5,2702.000000
3,3,1672.000000
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
    at java.util.ArrayList.rangeCheck(ArrayList.java:653)
    at java.util.ArrayList.get(ArrayList.java:429)
    at TestConverter.processPayments(TestConverter.java:113)
    at TestConverter.processFile(TestConverter.java:131)
    at TestConverter.main(TestConverter.java:142)

我得到以下输出:

java -classpath TestConverter.jar TestConverter test_xml.xml | grep "stringthatdoesnotmatch*"

我不确定为什么会这样。此外,我的最终目标是检查输出是否包含以下模式:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
    at java.util.ArrayList.rangeCheck(ArrayList.java:653)
    at java.util.ArrayList.get(ArrayList.java:429)
    at TestConverter.processPayments(TestConverter.java:113)
    at TestConverter.processFile(TestConverter.java:131)
    at TestConverter.main(TestConverter.java:142)

1 个答案:

答案 0 :(得分:2)

您实际上获得匹配。您必须了解的是标准输出与标准错误之间的区别。

Java程序正在将其正常输出写入前者,后者是例外,但两者这些流最初都附加到终端设备。

因此,当您添加管道时:

program | grep xyzzy

|字符会将program的标准输出转移到grep的标准输入。然后,这将过滤掉任何不包含xyzzy的行,并将其余行传递给标准输出,在这种情况下为终端。

program的标准错误仍然直接连接到终端,因此无论grep做什么,都会显示在那里。

如果您希望grep程序捕获`程序的输出错误,请先将它们合并:

program 2>&1 | grep xyzzy

2>&1表示获取目标为流2的内容(标准错误),而是将其发送到流1(标准输出)。然后,|可以接收来自program的输出/错误的所有