if grep -q "�" out.txt
then
echo "working"
else
cat out.txt
fi
Zasadniczo, jeśli plik „out.txt” zawiera „ ” w dowolnym miejscu pliku, chciałbym, aby echo „działało” ORAZ jeśli plik „out.txt” NIE zawiera nigdzie w pliku „ ”, to chciałbym to cat out.txt
EDYCJA: Więc oto co robię. Próbuję brutalną siłą odszyfrować openssl.
openssl enc zwraca 0 w przypadku sukcesu, w przeciwnym razie niezerowe. Uwaga: otrzymasz fałszywe alarmy, ponieważ AES / CBC może jedynie ustalić, czy „deszyfrowanie działa” w oparciu o prawidłowe wypełnienie. Plik jest odszyfrowywany, ale nie będzie to prawidłowe hasło, więc będzie w nim bełkot. Typową postacią w bełkocie jest „ ”. Dlatego chcę, aby pętla do kontynuowała działanie, jeśli wynik zawiera „ ”.
Oto mój link do git https://github.com/Raphaeangelo/OpenSSLCracker Heres the script
while read line
do
openssl aes-256-cbc -d -a -in $1 -pass pass:$line -out out.txt 2>out.txt >/dev/null && printf "==================================================\n"
if grep -q "�" out.txt
then
:
else
cat out.txt &&
printf "\n==================================================" &&
printfn"\npassword is $line\n" &&
read -p "press return key to continue..." < /dev/tty;
fi
done < ./password.txt
wciąż pokazuje mi wynik z charakterem
AKTUALIZACJA: rozwiązana
printf "Working..."
while read line
do
openssl aes-256-cbc -d -a -in $1 -pass pass:$line -out out.txt 2>out.txt >/dev/null
if file out.txt | grep -q 'out.txt: ASCII text'
then
printf "\n==================================================\n\n" &&
cat out.txt &&
printf "\n==================================================" &&
printf "\npassword is $line\n" &&
read -p "press return key to continue..." < /dev/tty;
else
:
fi
done < ./password.txt
grep
długo rozumie Unicode (co czyni go znacznie wolniejszym, więc wyszukiwanie ciągów asciiLANG=C grep
jest ogromną poprawą wydajności).How to grep for unicode � in a bash script
czy naprawdę tego chcesz? wyodrębnić Unicode? prosimy o wyjaśnienie, abyśmy mogli pomóc!Odpowiedzi:
grep
jest niewłaściwym narzędziem do pracy.Widzisz
U+FFFD REPLACEMENT CHARACTER
nie dlatego, że jest dosłownie w treści pliku, ale dlatego, że spojrzałeś na plik binarny za pomocą narzędzia, które powinno obsługiwać tylko wprowadzanie tekstu. Standardowym sposobem obsługi nieprawidłowych danych wejściowych (tj. Losowych danych binarnych) jest zastąpienie wszystkiego, co nie jest poprawne w bieżących ustawieniach regionalnych (najprawdopodobniej UTF-8), U + FFFD, zanim trafi ono na ekran.Oznacza to, że jest bardzo prawdopodobne, że literał
\xEF\xBF\xBD
(sekwencja bajtów UTF-8 dla znaku U + FFFD) nigdy nie występuje w pliku.grep
ma rację mówiąc, że nie ma.Jednym ze sposobów wykrycia, czy plik zawiera jakiś nieznany plik binarny, jest
file(1)
polecenie:W przypadku każdego nieznanego typu pliku będzie to po prostu powiedzieć
data
. Próbowaćaby sprawdzić, czy plik naprawdę zawiera dowolny dowolny plik binarny, a tym samym najprawdopodobniej śmieci.
Jeśli chcesz się upewnić, że
out.txt
jest to tylko plik tekstowy zakodowany w UTF-8, możesz alternatywnie użyćiconv
:źródło
file
wykrywa jakiś inny typ zawartości dla tych plików. Jeśli 100% zawsze tylko oczekiwać kodowanie UTF-8 pliki tekstowe, można sprawdzić uiconv
, jeśli plik jest ważny UTF-8:iconv -f utf-8 -t utf-16 out.txt >/dev/null
. Jeśliiconv
nie można przekonwertować pliku z powodu nieprawidłowych sekwencji UTF-8, zostanie zwrócony z niezerowym kodem wyjścia.grep -axv '.*' badchars.txt
. Spowoduje to wydrukowanie dowolnego wiersza zawierającego dowolny nieprawidłowy znak Unicode .file
robi.TL; DR:
długa odpowiedź
Obie obecne odpowiedzi są bardzo mylące i zasadniczo błędne.
Aby przetestować, pobierz te dwa pliki (od bardzo dobrze uznanego programisty: Markusa Kuhna):
Próbny
Pierwszy
UTF-8-demo.txt
to plik zaprojektowany, aby pokazać, jak dobrze UTF-8 jest w stanie przedstawić wiele języków, matematykę, alfabet Braille'a i wiele innych przydatnych typów znaków. Spójrz za pomocą edytora tekstu (który rozumie utf-8), a zobaczysz wiele przykładów i nie�
.Test zaproponowany przez jedną odpowiedź: ograniczenie zakresu znaków do
\x00-\x7F
odrzucenia prawie wszystkiego w tym pliku.To bardzo źle i nie usunie żadnego,
�
ponieważ nie ma go w tym pliku .Zastosowanie testu zalecanego w tej odpowiedzi spowoduje usunięcie
72.5 %
pliku:To jest (dla najbardziej praktycznych celów) cały plik. Plik bardzo dobrze zaprojektowany, aby wyświetlać idealnie poprawne znaki.
Test
Drugi plik ma na celu wypróbowanie kilku przypadków granicznych w celu potwierdzenia, że czytniki utf-8 wykonują dobrą robotę. Zawiera wiele znaków, które powodują wyświetlenie znaku . Ale druga rekomendacja odpowiedzi (wybrana)
file
zawodzi rażąco z tym plikiem. Tylko usunięcie zerowego bajtu (\0
) (który technicznie jest poprawny ASCII) i\x7f
bajtu (DEL - usuń) (który oczywiście jest również znakiem ASCII) sprawi, że cały plik będzie ważny dlafile
polecenia:Nie tylko nie
file
wykrywa wielu niepoprawnych znaków, ale także nie wykrywa i nie zgłasza, że jest to plik zakodowany w UTF-8.I tak,
file
jest w stanie wykryć i zgłosić tekst zakodowany w UTF-8:Ponadto
file
nie zgłasza jako ASCII większości znaków kontrolnych z zakresu od 1 do 31.file
Zgłasza niektóre zakresy jakodata
:Inne jako
ASCII text
:Jako zakres znaków do wydruku (z nowymi liniami):
Ale niektóre zakresy mogą powodować dziwne wyniki:
Program
file
nie jest narzędziem do wykrywania tekstu, ale do wykrywania magicznych liczb w wykonywalnych programach lub plikach.Wykryto zakresy
file
i odpowiedni typ zgłoszony przeze mnie znaleziony to:Wartości jednobajtowe, głównie ascii:
Zakodowane zakresy Utf-8:
Jedno z możliwych rozwiązań znajduje się poniżej.
Poprzednia odpowiedź.
Wartość Unicode publikowanego znaku to:
Tak, jest to znak Unicode „ZMIANA WYMIANY” (U + FFFD) . Jest to znak używany do zastąpienia dowolnego nieprawidłowego znaku Unicode znalezionego w tekście. To „pomoc wizualna”, a nie prawdziwa postać. Aby znaleźć i wyświetlić każdą pełną linię zawierającą nieprawidłowe znaki UNICODE, użyj:
ale jeśli chcesz tylko wykryć, czy jakiś znak jest nieprawidłowy, użyj:
Jeśli wynikiem jest to,
1
że plik jest czysty, w przeciwnym razie wyniesie zero0
.Jeśli pytałeś: jak znaleźć
�
postać, użyj tego:Lub jeśli twój system poprawnie przetwarza tekst UTF-8, po prostu:
źródło
grep -axv '.*'
!! Walczyłem z kilkoma złymi znakami w moich plikach tekstowych i jak je naprawić w emacsie, przez dekadę lub dwie !!!Ta bardzo wczesna odpowiedź dotyczyła oryginalnego postu, który brzmiał:
Próbować
z następującym
if .. then
oświadczeniem:Objaśnienie💡:
-P
,--perl-regexp
: WZÓR jest wyrażeniem regularnym Perla-o
,--only-matching
: pokaż tylko część linii pasującą do WZORCA[^\x00-\x7F]
jest wyrażeniem regularnym pasującym do pojedynczego znaku spoza ASCII.[[:ascii:]]
- dopasowuje pojedynczy znak ASCII[^[:ascii:]]
- dopasowuje pojedynczy znak spoza ASCIIw
bash
źródło
printf '%b' "$(printf '\\U%x' {128..131})" | grep -oP "[^\x00-\x7F]"
tylko 4 prawidłowe znaki Unicode, które odrzuca Twój kod. :-(