Jednym ze sposobów jest po prostu traktowanie plików binarnych jako tekstowych, grep --text
ale może to skutkować wysłaniem binarnych informacji do terminala. To nie jest dobry pomysł, jeśli używasz terminala, który interpretuje strumień wyjściowy (taki jak VT / DEC lub wiele innych).
Alternatywnie możesz wysłać plik za tr
pomocą następującego polecenia:
tr '[\000-\011\013-\037\177-\377]' '.' <test.log | grep whatever
Spowoduje to zmianę wszystkiego, co jest mniejsze niż znak spacji (z wyjątkiem nowej linii) i cokolwiek większego niż 126, w .
znak, pozostawiając tylko materiały do wydrukowania.
Jeśli chcesz, aby każdy „niedozwolony” znak został zastąpiony innym, możesz użyć czegoś takiego jak poniższy program w C, klasyczny standardowy filtr wejściowy:
#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;
}
To da ci {{NN}}
, gdzie NN
jest kod szesnastkowy znaku. Możesz po prostu dostosować printf
do dowolnego stylu wydruku.
Możesz zobaczyć ten program w akcji tutaj, gdzie:
pax$ printf 'Hello,\tBob\nGoodbye, Bob\n' | ./filterProg
Hello,{{09}}Bob
Goodbye, Bob