Краткий ответ: ваш метод 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
.
Вы можете запустить файл данных через cat -v
, например
$ cat -v tmp/test.log | grep re
line1 re ^@^M
line3 re^M
, который затем может быть затем обработан для последующей обработки, чтобы удалить мусор; это наиболее похоже на ваш запрос об использовании tr
для задачи.
Вы можете заставить grep смотреть двоичные файлы с помощью:
grep --binary-files=text
Вы также можете добавить -o
(--only-matching
), чтобы не получить тонны бинарной тарабарщины, которая будет bork ваш терминал.
Как уже сказал Джеймс Селвакумар, grep -a
делает трюк. -a или -text заставляет Grep обрабатывать входной поток как текст. См. Manpage http://unixhelp.ed.ac.uk/CGI/man-cgi?grep
try
cat test.log | grep -a somestring
grep -a заставит grep искать и выводить из файла, который grep считает двоичным. grep -a re test.log
Вы также можете попробовать инструмент Word Extractor . Word Extractor можно использовать с любым файлом на вашем компьютере для разделения строк, содержащих человеческий текст / слова из двоичного кода (exe-приложения, библиотеки DLL).
Вы можете использовать «строки» для извлечения строк из двоичного файла, например
strings binary.file | grep foo
вы можете сделать
strings test.log | grep -i
, это преобразование даст результат как читаемую строку для grep.
Один из способов - просто обрабатывать двоичные файлы как текст в любом случае, с 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
Начиная с Grep 2.21, двоичные файлы обрабатываются по-разному :
При поиске двоичных данных grep теперь может обрабатывать нетекстовые байты в качестве терминаторов строк. Это может значительно повысить производительность.
blockquote>Итак, теперь происходит то, что с бинарными данными все нетекстовые байты (включая новые строки) рассматриваются как терминаторы строк. Если вы хотите изменить это поведение, вы можете:
- использовать
--text
. Это гарантирует, что только новые строки являются терминаторами строк- , используя
--null-data
. Это гарантирует, что только нулевые байты являются терминаторами строк