2010-04-16 3 views
1

У меня проблема, когда вызов grep изнутри java дает неверные результаты по сравнению с результатами вызова grep в том же файле в оболочке.Вызов Grep внутри Java дает неправильные результаты при вызове grep в shell дает правильные результаты

Моя команда Grep (. Называется как в Java и Баш я бежал косую черту в Java соответственно):

/bin/grep -vP --regexp='^[0-9]+\t.*' /usr/local/apache-tomcat-6.0.18/work/Catalina/localhost/saccitic/237482319867147879_1271411421 

Java код:

String filepath = "/path/to/file"; 
String options = "P"; 
String grepparams = "^[0-9]+\\t.*"; 
String greppath = "/bin/"; 

String[] localeArray = new String[] { 
    "LANG=", 
    "LC_COLLATE=C", 
    "LC_CTYPE=UTF-8", 
    "LC_MESSAGES=C", 
    "LC_MONETARY=C", 
    "LC_NUMERIC=C", 
    "LC_TIME=C", 
    "LC_ALL=" 
}; 

options = "v"+options; //Assign optional params 

if (options.contains("P")) { 
    grepparams = "\'"+grepparams+"\'"; //Quote the regex expression if -P flag is used 
} else { 
    options = "E"+options; //equivalent to calling egrep 
} 

proc = sysRuntime.exec(greppath+"/grep -"+options+" --regexp="+grepparams+" "+filepath, localeArray); 
System.out.println(greppath+"/grep -"+options+" --regexp="+grepparams+" "+filepath); 
inStream = proc.getInputStream(); 

Команда, как предполагается, чтобы соответствовать и отбрасывать строки, подобные этим:

85295371616 Hi Mr Lee, please be informed that... 

Мой входной файл состоит в следующем:

85aaa234567 Hi Ms Chan, please be informed that... 
85292vx5678 Hi Mrs Ng, please be informed that... 
85295371616 Hi Mr Lee, please be informed that... 
85aaa234567 Hi Ms Chan, please be informed that... 
85292vx5678 Hi Mrs Ng, please be informed that... 
85295371616 Hi Mr Lee, please be informed that... 
85295371616 Hi Mr Lee, please be informed that... 
85295371616 Hi Mr Lee, please be informed that... 
85295371616 Hi Mr Lee, please be informed that... 
85295371616 Hi Mr Lee, please be informed that... 
8~!95371616 Hi Mr Lee, please be informed that... 
85295371616 Hi Mr Lee, please be informed that... 
852&^*&1616 Hi Mr Lee, please be informed that... 
8529537Ax16 Hi Mr Lee, please be informed that... 
85====ppq16 Hi Mr Lee, please be informed that... 
85291234783 a3283784428349247233834728482984723333 
85219299222 

команд работает, когда я называю ее изнутри Баш (Результаты ниже):

85aaa234567 Hi Ms Chan, please be informed that... 
85292vx5678 Hi Mrs Ng, please be informed that... 
85aaa234567 Hi Ms Chan, please be informed that... 
85292vx5678 Hi Mrs Ng, please be informed that... 
8~!95371616 Hi Mr Lee, please be informed that... 
852&^*&1616 Hi Mr Lee, please be informed that... 
8529537Ax16 Hi Mr Lee, please be informed that... 
85====ppq16 Hi Mr Lee, please be informed that... 
85219299222 

Однако, когда я снова позвонить Grep внутри Java, я получаю весь файл (Результаты ниже):

85aaa234567 Hi Ms Chan, please be informed that... 
85292vx5678 Hi Mrs Ng, please be informed that... 
85295371616 Hi Mr Lee, please be informed that... 
85aaa234567 Hi Ms Chan, please be informed that... 
85292vx5678 Hi Mrs Ng, please be informed that... 
85295371616 Hi Mr Lee, please be informed that... 
85295371616 Hi Mr Lee, please be informed that... 
85295371616 Hi Mr Lee, please be informed that... 
85295371616 Hi Mr Lee, please be informed that... 
85295371616 Hi Mr Lee, please be informed that... 
8~!95371616 Hi Mr Lee, please be informed that... 
85295371616 Hi Mr Lee, please be informed that... 
852&^*&1616 Hi Mr Lee, please be informed that... 
8529537Ax16 Hi Mr Lee, please be informed that... 
85====ppq16 Hi Mr Lee, please be informed that... 
85291234783 a3283784428349247233834728482984723333 
85219299222 

В чем может быть проблема, из-за которой grep, вызываемый Java, возвращает неверные результаты? Я попытался передать локальную информацию через массив строк среды в runtime.exec, но ничего не изменилось. Я неправильно передаю информацию локали, или это проблема чего-то еще?

+0

Пожалуйста, покажите код Java. –

+0

Почему вы вызываете grep из Java? Почему бы просто не использовать класс Pattern и избежать необходимости делать внешние вызовы для оболочки? – Adamski

+0

Я буду обрабатывать много файлов с 500k + линиями в рабочей среде, поэтому для этого мне нужно полагаться на внешние инструменты. – futureelite7

ответ

2

Одиночные кавычки используются оболочкой и не видны grep. Вы не должны добавлять их в java.

Кроме того, вы должны использовать метод exec (String [], String []) вместо конкатенации параметров, поэтому вы можете контролировать разделение параметров.

И я согласен с другими комментариями, говорящими, что вы должны делать это в чистой java вместо запуска grep в отдельном процессе.

+0

Удаление цитат сделало трюк. Благодаря! – futureelite7

Смежные вопросы