직장에서 매우 유용한 명령이 있습니다. 특정 항목을 검색합니다.끈일부 16진수 원시 파일에서파일 이름. Linux 시스템에서 자주 사용하는 명령은 다음과 같습니다.
find . -name '**FILENAME**' | while read filename; do
xxd -p $filename | tr -d '\n' | grep -i "**STRING**" > /dev/null
if [ $? -eq 0 ];then
echo "STRING FOUND IN $filename";
fi;
done
나는 이 명령을 작성하지 않았습니다. HP-UX 시스템에서는 xxd가 존재하지 않으므로 xd를 사용해야 합니다. 하지만 xxd -p와 동일한 결과를 얻는 방법을 모르겠습니다.
HP-UX 시스템에서 실행되도록 이 명령을 어떻게 조정합니까?
답변1
저는 HP-UX를 사용하지 않으므로 이것만 확인했습니다.xd(1):
xd -b -An -v $filename
-An
오프셋 표시 방지-b
기본값은 1바이트입니다(8진수는od
, 16진수는xd
).-v
동일한 줄이 다음으로 대체되는 것을 방지합니다.*
(저를 포함한 많은 시스템에 이 기능이 있지만 od
없습니다 xd
. 그래서 이식성을 위해 사용했습니다 od -tx1 -An -v $filename
.)
그러면 각 바이트 사이에 공백이 있는 개별 16진수 바이트가 출력됩니다. tr
명령을 변경하면 tr -d [:space:]
개행 문자뿐만 아니라 모든 공백이 제거됩니다.
이 모든 것을 하나로 묶으려면 스크립트의 xxd
및 부분을 바꿔서 줄이 다음과 같이 보이도록 해야 합니다.tr
xd -b -An -v $filename | tr -d '[:space:]' | grep -i "**STRING**" > /dev/null
답변2
주문하다
xxd -p < file | tr -d '\n'
간단한 Perl 스크립트로 대체 가능
perl -ne 'foreach $c (split(//,$_)) { printf "%02x",ord($c)}' < file