if grep -q "�" out.txt
then
echo "working"
else
cat out.txt
fi
Basicamente, se o arquivo "out.txt" contiver " " em qualquer lugar do arquivo, gostaria que ele ecoasse "funcionando" E se o arquivo "out.txt" NÃO contiver " " em qualquer lugar do arquivo, eu gostaria para cat out.txt
EDIT: Então aqui está o que estou fazendo. Estou tentando fazer força bruta e descriptografar openssl.
openssl enc retorna 0 em caso de sucesso, diferente de zero. Nota: você obterá falsos positivos porque o AES / CBC só pode determinar se a "descriptografia funciona" com base na correção do preenchimento. Portanto, o arquivo descriptografa, mas não será a senha correta e, portanto, terá bobagens. Um personagem comum no jargão é " ". Então, eu quero que o loop continue, se a saída contiver " ".
Heres meu link git https://github.com/Raphaeangelo/OpenSSLCracker Heres o 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
Ainda está me mostrando saída com o `` charicter '' nele
UPDATE: Resolvido
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
long compreende o unicode (o que o torna muito mais lento, portanto, para procurar por seqüências ascii, aLANG=C grep
é uma grande melhoria de desempenho).How to grep for unicode � in a bash script
é isso mesmo que você quer? extrair o unicode? esclareça para que possamos ajudar!Respostas:
grep
é a ferramenta errada para o trabalho.Você vê o ``
U+FFFD REPLACEMENT CHARACTER
não porque está literalmente no conteúdo do arquivo, mas porque você olhou para um arquivo binário com uma ferramenta que deveria lidar apenas com entrada baseada em texto. A maneira padrão de lidar com entradas inválidas (ou seja, dados binários aleatórios) é substituir tudo o que não é válido no código do idioma atual (provavelmente UTF-8) por U + FFFD antes que ele atinja a tela.Isso significa que é muito provável que um literal
\xEF\xBF\xBD
(a sequência de bytes UTF-8 para o caractere U + FFFD) nunca ocorra no arquivo.grep
tem toda a razão em dizer que não há.Uma maneira de detectar se um arquivo contém algum binário desconhecido é com o
file(1)
comando:Para qualquer tipo de arquivo desconhecido, basta dizer
data
. Experimentarpara verificar se o arquivo realmente contém algum binário arbitrário e, portanto, provavelmente lixo.
Se quiser ter certeza de que
out.txt
é apenas um arquivo de texto codificado em UTF-8, você também pode usariconv
:fonte
file
detecta algum outro tipo de conteúdo para esses arquivos. Se você 100% sempre esperam apenas UTF-8 arquivos de texto codificados, você pode verificar comiconv
, se um arquivo é válido UTF-8:iconv -f utf-8 -t utf-16 out.txt >/dev/null
. Seiconv
não puder converter o arquivo devido a seqüências UTF-8 inválidas, ele retornará com um código de saída diferente de zero.grep -axv '.*' badchars.txt
. Isso imprimirá qualquer linha que contenha qualquer caractere Unicode inválido .file
faz.TL; DR:
resposta longa
Ambas as respostas atuais são extremamente enganosas e basicamente erradas.
Para testar, obtenha esses dois arquivos (de um desenvolvedor muito conceituado: Markus Kuhn):
Demo
O primeiro
UTF-8-demo.txt
é um arquivo projetado para mostrar como o UTF-8 é capaz de apresentar muitos idiomas, matemática, braille e muitos outros tipos úteis de caracteres. Dê uma olhada com um editor de texto (que entende utf-8) e você verá muitos exemplos e não�
.O teste que uma resposta propõe: limitar o intervalo de caracteres
\x00-\x7F
rejeitará quase tudo dentro deste arquivo.Isso está muito errado e não removerá nenhum,
�
pois não há nenhum nesse arquivo .O uso do teste recomendado nessa resposta removerá
72.5 %
o arquivo:Isso é (para propósitos mais práticos) o arquivo inteiro. Um arquivo muito bem projetado para mostrar caracteres perfeitamente válidos.
Teste
O segundo arquivo foi projetado para tentar vários casos de borda para confirmar que os leitores utf-8 estão fazendo um bom trabalho. Ele contém dentro de muitos caracteres que farão com que um ' ' seja mostrado. Mas a outra recomendação de resposta (a selecionada) a ser usada
file
falha bastante nesse arquivo. Somente a remoção de um byte zero (\0
) (que tecnicamente é ASCII válido) e um\x7f
byte (DEL - delete) (que também é claramente um caractere ASCII) tornará todo o arquivo válido para ofile
comando:Não apenas
file
falha na detecção dos muitos caracteres incorretos, mas também na detecção e no relatório de que é um arquivo codificado em UTF-8.E sim,
file
é capaz de detectar e relatar texto codificado em UTF-8:Além disso,
file
falha ao relatar como ASCII a maioria dos caracteres de controle no intervalo de 1 a 31. Ele (file
) relata alguns intervalos comodata
:Outros como
ASCII text
:Como o intervalo de caracteres imprimíveis (com novas linhas):
Mas alguns intervalos podem causar resultados estranhos:
O programa
file
não é uma ferramenta para detectar texto, mas para detectar números mágicos em programas ou arquivos executáveis.Os intervalos
file
detectam e o tipo correspondente relatado que encontrei foram:Valores de um byte, principalmente ascii:
Intervalos codificados Utf-8:
Uma solução possível está abaixo.
Resposta anterior.
O valor Unicode para o personagem que você está postando é:
Sim, esse é um caractere Unicode 'REPLACEMENT CHARACTER' (U + FFFD) . Esse é um caractere usado para substituir qualquer caractere Unicode inválido encontrado no texto. É um "auxílio visual", não um personagem real. Para localizar e listar todas as linhas completas que contêm caracteres UNICODE inválidos , use:
mas se você quiser detectar apenas se algum caractere é inválido, use:
Se o resultado for que
1
o arquivo está limpo, caso contrário, será zero0
.Se o que você estava perguntando era: como encontrar o
�
personagem, use o seguinte:Ou, se o seu sistema processar texto UTF-8 corretamente, simplesmente:
fonte
grep -axv '.*'
!! Eu lutei com alguns caracteres ruins nos meus arquivos de texto e como corrigi-los no emacs, por uma década ou duas !!!Essa resposta foi muito cedo para o post original, que era:
Experimentar
com uma
if .. then
declaração da seguinte maneira:Explicação💡:
-P
,--perl-regexp
: PATTERN é uma expressão regular do Perl-o
,--only-matching
: mostra apenas a parte de uma linha correspondente a PATTERN[^\x00-\x7F]
é uma regex para corresponder a um único caractere não ASCII.[[:ascii:]]
- corresponde a um único caractere ASCII[^[:ascii:]]
- corresponde a um único caractere não ASCIIno
bash
fonte
printf '%b' "$(printf '\\U%x' {128..131})" | grep -oP "[^\x00-\x7F]"
apenas 4 caracteres Unicode válidos que seu código rejeita. :-(