Почему grep не работает, как ожидалось, с большим файлом? [Дубликат]

Краткий ответ: ваш метод foo() возвращается немедленно, а вызов $ajax() выполняется асинхронно после возврата функции . Проблема заключается в том, как и где сохранить результаты, полученные при вызове async, после его возврата.

В этом потоке было задано несколько решений. Возможно, самый простой способ - передать объект методу foo() и сохранить результаты в члене этого объекта после завершения асинхронного вызова.

function foo(result) {
    $.ajax({
        url: '...',
        success: function(response) {
            result.response = response;   // Store the async result
        }
    });
}

var result = { response: null };   // Object to hold the async result
foo(result);                       // Returns before the async completes

Обратите внимание, что вызов foo() ] все равно не вернут ничего полезного. Однако результат асинхронного вызова теперь будет сохранен в result.response.

101
задан Daniel YC Lin 14 December 2014 в 04:31
поделиться

10 ответов

Вы можете запустить файл данных через cat -v, например

$ cat -v tmp/test.log | grep re
line1 re ^@^M
line3 re^M

, который затем может быть затем обработан для последующей обработки, чтобы удалить мусор; это наиболее похоже на ваш запрос об использовании tr для задачи.

56
ответ дан vielmetti 25 August 2018 в 04:25
поделиться

Вы можете заставить grep смотреть двоичные файлы с помощью:

grep --binary-files=text

Вы также можете добавить -o (--only-matching), чтобы не получить тонны бинарной тарабарщины, которая будет bork ваш терминал.

19
ответ дан A B 25 August 2018 в 04:25
поделиться

Как уже сказал Джеймс Селвакумар, grep -a делает трюк. -a или -text заставляет Grep обрабатывать входной поток как текст. См. Manpage http://unixhelp.ed.ac.uk/CGI/man-cgi?grep

try

cat test.log | grep -a somestring
3
ответ дан DerKnorr 25 August 2018 в 04:25
поделиться
grep -a

Это не может быть проще.

74
ответ дан James Selvakumar 25 August 2018 в 04:25
поделиться

grep -a заставит grep искать и выводить из файла, который grep считает двоичным. grep -a re test.log

0
ответ дан Kevin Buchs 25 August 2018 в 04:25
поделиться

Вы также можете попробовать инструмент Word Extractor . Word Extractor можно использовать с любым файлом на вашем компьютере для разделения строк, содержащих человеческий текст / слова из двоичного кода (exe-приложения, библиотеки DLL).

0
ответ дан MattCollW 25 August 2018 в 04:25
поделиться

Вы можете использовать «строки» для извлечения строк из двоичного файла, например

strings binary.file | grep foo
32
ответ дан moodywoody 25 August 2018 в 04:25
поделиться

вы можете сделать

strings test.log | grep -i

, это преобразование даст результат как читаемую строку для grep.

2
ответ дан Mrid 25 August 2018 в 04:25
поделиться

Один из способов - просто обрабатывать двоичные файлы как текст в любом случае, с grep --text, но это может привести к тому, что двоичная информация будет отправлена ​​на ваш терминал. Это не очень хорошая идея, если вы используете терминал, который интерпретирует выходной поток (например, VT / DEC или многие другие).

Кроме того, вы можете отправить файл через tr со следующим command:

tr '[\000-\011\013-\037\177-\377]' '.' <test.log | grep whatever

Это изменит что-нибудь меньшее, чем пробельный символ (кроме новой строки) и ничего больше 126, на символ ., оставив только печатные материалы.


Если вы хотите, чтобы каждый «незаконный» символ заменялся другим, вы можете использовать что-то вроде следующей программы на C: классический стандартный входной фильтр:

#include<stdio.h>
int main (void) {
    int ch;
    while ((ch = getchar()) != EOF) {
        if ((ch == '\n') || ((ch >= ' ') && (ch <= '~'))) {
            putchar (ch);
        } else {
            printf ("{{%02x}}", ch);
        }
    }
    return 0;
}

Это даст вам {{NN}} , где NN - шестнадцатеричный код для символа. Вы можете просто отрегулировать printf для любого желаемого стиля вывода.

Вы можете увидеть эту программу в действии здесь, где она:

pax$ printf 'Hello,\tBob\nGoodbye, Bob\n' | ./filterProg
Hello,{{09}}Bob
Goodbye, Bob
81
ответ дан paxdiablo 25 August 2018 в 04:25
поделиться

Начиная с Grep 2.21, двоичные файлы обрабатываются по-разному :

При поиске двоичных данных grep теперь может обрабатывать нетекстовые байты в качестве терминаторов строк. Это может значительно повысить производительность.

Итак, теперь происходит то, что с бинарными данными все нетекстовые байты (включая новые строки) рассматриваются как терминаторы строк. Если вы хотите изменить это поведение, вы можете:

  • использовать --text. Это гарантирует, что только новые строки являются терминаторами строк
  • , используя --null-data. Это гарантирует, что только нулевые байты являются терминаторами строк
12
ответ дан Steven Penny 25 August 2018 в 04:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: