У меня проблема, когда вызов grep изнутри java дает неверные результаты по сравнению с результатами вызова grep для того же файла в оболочке.
Моя команда grep (вызывается как в Java, так и в bash. Я избежал косой черты в 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
Команды работают, когда я вызываю их изнутри bash (Результаты ниже):
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, но, похоже, ничего не изменилось. Я неправильно передаю информацию о локали, или проблема в чем-то совершенно другом?