grep zwraca
Plik binarny test.log pasuje
Na przykład
echo "line1 re \x00\r\nline2\r\nline3 re\r\n" > test.log # in zsh
echo -e "line1 re \x00\r\nline2\r\nline3 re\r\n" > test.log # in bash
grep re test.log
Chciałbym, żeby wynik pokazał line1 i line3 (łącznie dwie linie).
Czy jest możliwe użycie tr
konwersji danych, których nie można wydrukować na dane, które można odczytać, aby grep znów działał?
-e
ciecho
dowództwa?Odpowiedzi:
Możesz uruchomić plik danych
cat -v
, npktóre można następnie poddać dalszej obróbce końcowej w celu usunięcia śmieci; jest to najbardziej analogiczne do zapytania dotyczącego użycia
tr
do zadania.źródło
man cat
mówi o-v
:-v, --show-nonprinting
use ^ and M- notation, except for LFD and TAB
set | cat -v | grep variable
grep --text
nie zawsze działa; szanuje CTRL + D jako terminator pliku. Więc jeśli masz to w swoim pliku binarnym, grep zakończy działanie wcześniej.To nie może być prostsze.
źródło
grep --text
czym paxdiablo wspominał 2 lata wcześniejLC_ALL="C" grep -a
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: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:
To da ci
{{NN}}
, gdzieNN
jest kod szesnastkowy znaku. Możesz po prostu dostosowaćprintf
do dowolnego stylu wydruku.Możesz zobaczyć ten program w akcji tutaj, gdzie:
źródło
tr '[:cntrl:] '.'
jest lepiej. I powinno być\000-\010\013\014\016-\037\177-\377'
w twojej składni tr.tr '[\000-\010\013\014\016-\037\177-\377]' '_'
działającym, cntrl nie jest odpowiedni dla mojego przypadku.cat
krok, podłączającgrep --text
dotr
zamiast odwrotnie. Pozwala to również na grepowanie wielu plików i zachowanie odniesienia do nazwy pliku w wyniku.Możesz na przykład użyć „ciągów” do wyodrębnienia łańcuchów z pliku binarnego
źródło
Możesz zmusić grep do przeglądania plików binarnych za pomocą:
Możesz także chcieć dodać
-o
(--only-matching
), aby nie dostać tony binarnego bełkotu, który zepsuje twój terminal.źródło
--only-matching
, a twoje wyrażenie regularne nie pasuje do dowolnych danych binarnych, nie będziesz mieć problemu.Począwszy od Grepa 2.21, pliki binarne są traktowane inaczej :
Tak więc teraz w przypadku danych binarnych wszystkie bajty nietekstowe (w tym znaki nowej linii) są traktowane jako terminatory linii. Jeśli chcesz zmienić to zachowanie, możesz:
używać
--text
. Zapewni to, że tylko znaki nowej linii będą zakończeniami liniiużywać
--null-data
. Zapewni to, że tylko bajty zerowe są terminatorami liniiźródło
grep -a zmusi grep do wyszukania i wyjścia z pliku, który grep uważa za binarny. grep -a re test.log
źródło
Jak już powiedział James Selvakumar, załatwia sprawę
grep -a
. -a lub --text zmusza Grepa do obsługi strumienia wejściowego jako tekstu. Zobacz stronę podręcznika http://unixhelp.ed.ac.uk/CGI/man-cgi?greppróbować
źródło
możesz to zrobić
spowoduje to przekonwertowanie danych wyjściowych jako czytelnego ciągu na grep.
źródło
Możesz także wypróbować narzędzie Word Extractor . Word Extractor może być używany z dowolnym plikiem na komputerze w celu oddzielenia ciągów znaków zawierających tekst / słowa ludzkie od kodu binarnego (aplikacje exe, biblioteki DLL).
źródło
Oto, czego użyłem w systemie, w którym nie zainstalowano polecenia „ciągi”
To drukuje tekst i usuwa niedrukowalne znaki za jednym zamachem, w przeciwieństwie do "cat -v filename", który wymaga dodatkowego przetwarzania w celu usunięcia niechcianych elementów. Zauważ, że niektóre dane binarne mogą być wydrukowane, więc nadal będziesz mieć jakiś bełkot między dobrymi rzeczami. Myślę, że struny również usuwają ten bełkot, jeśli możesz tego użyć.
źródło