Linux

如何在 bash 腳本中對 unicode 進行 grep

  • January 5, 2021
if grep -q "�" out.txt
   then
       echo "working"
   else
       cat out.txt
fi

基本上,如果文件“out.txt”在文件中的任何位置包含“�”,我希望它回顯“工作”並且如果文件“out.txt”在文件中的任何位置不包含“�”,那麼我想要它要貓出.txt

編輯:所以這就是我正在做的事情。我正在嘗試暴力破解openssl解密。

openssl enc 成功返回 0,否則返回非零。注意:您會得到誤報,因為 AES/CBC 只能根據填充正確來確定“解密是否有效”。所以文件解密但它不會是正確的密碼,所以它會有亂碼。亂碼中的一個常見字元是“�”。因此,如果輸出包含“�”,我希望 do 循環繼續執行。

這是我的 git 連結https://github.com/Raphaeangelo/OpenSSLCracker 這是腳本

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

它仍然向我顯示帶有�字元的輸出

grep是工作的錯誤工具。

您看到 � U+FFFD REPLACEMENT CHARACTER不是因為它確實存在於文件內容中,而是因為您使用應該只處理基於文本的輸入的工具查看了二進製文件。處理無效輸入(即隨機二進制數據)的標準方法是在螢幕出現之前用 U+FFFD 替換在目前語言環境(很可能是 UTF-8)中無效的所有內容。

這意味著文件中很可能\xEF\xBF\xBD永遠不會出現文字(U+FFFD 字元的 UTF-8 字節序列)。grep完全正確地告訴你,沒有。

檢測文件是否包含某些未知二進製文件的一種方法是使用以下file(1)命令:

$ head -c 100 /dev/urandom > rubbish.bin
$ file rubbish.bin
rubbish.bin: data

對於任何未知的文件類型,它只會說data. 嘗試

$ file out.txt | grep '^out.txt: data$'

檢查文件是否真的包含任何任意二進製文件,因此很可能是垃圾。

如果您想確保它out.txt只是一個 UTF-8 編碼的文本文件,您也可以使用iconv

$ iconv -f utf-8 -t utf-16 out.txt >/dev/null

引用自:https://unix.stackexchange.com/questions/474709