grep을 사용하여 인쇄할 수 없는 "블록형" 문자 필터링

grep을 사용하여 인쇄할 수 없는 "블록형" 문자 필터링

(교육 목적으로) 필터링하려는 Linux 시스템에 데이터베이스 제어 파일이 있습니다. 그러나 "블록형" 문자를 제거하는 올바른 방법을 찾을 수 없습니다.

▒▒▒▒
▒▒▒▒
▒▒▒▒
▒▒▒▒▒
▒▒▒{
▒▒▒▒▒▒9
▒▒▒▒
▒▒▒▒▒

여러 가지 방법을 시도했지만 블록 문자가 제거되지 않습니다.

258     strings o1_mf_d3rrgv0l_.ctl|grep -vE '▒'
259     strings o1_mf_d3rrgv0l_.ctl|grep -vE '@|?|+|(|)|<|>'
260     strings o1_mf_d3rrgv0l_.ctl|grep -vE '@|\?|\+|(|)|<|>'
261     strings o1_mf_d3rrgv0l_.ctl|grep -vE '@|\?|\+|\(|\)|\<|\>'
262     strings o1_mf_d3rrgv0l_.ctl|grep -vE '@|\?|\+|\(|\)|\<|\>|!'
263     strings o1_mf_d3rrgv0l_.ctl|grep -vE '@|\?|\+|\(|\)|\<|\>|!|\^|\%|\`'
264     strings o1_mf_d3rrgv0l_.ctl|grep -vE '@|\?|\+|\(|\)|\<|\>|!|\^|\%|\`|\$'
265     strings o1_mf_d3rrgv0l_.ctl|grep -v '[^[:print:]]'
266     strings o1_mf_d3rrgv0l_.ctl|grep -v '[[:print:]]'
267     strings o1_mf_d3rrgv0l_.ctl|grep  '[[:print:]]'
268     strings o1_mf_d3rrgv0l_.ctl|grep -v  '[[:cntrl:]]'
269     strings o1_mf_d3rrgv0l_.ctl|grep -v '\x{09}'
270     strings o1_mf_d3rrgv0l_.ctl|grep -vP '[^\x00-\x7f]'
271     strings o1_mf_d3rrgv0l_.ctl|tr -dc '\007-\011\012-\015\040-\376'
272     strings -1 o1_mf_d3rrgv0l_.ctl|tr -dc '\007-\011\012-\015\040-\376'
273     strings o1_mf_d3rrgv0l_.ctl|tr -dc '[:print:]\n\r'
274     strings o1_mf_d3rrgv0l_.ctl|grep -vE '@|\?|\+|\(|\)|\<|\>|!|\^|\%|\`|\$'
275     strings o1_mf_d3rrgv0l_.ctl|grep -vE '@|\?|\+|\(|\)|\<|\>|!|\^|\%|\`|\;|\:|\=|\$'
276     strings o1_mf_d3rrgv0l_.ctl|grep -vE '@|\?|\+|\(|\)|\<|\>|!|\^|\%|\`|\;|\:|\=|\$|\"'
277     strings o1_mf_d3rrgv0l_.ctl|grep -vE '@|\?|\+|\(|\)|\<|\>|!|\^|\%|\`|\;|\:|\=|\$|\"|\&|\#'

답변1

"정상적으로 알려진" 문자 이외의 다른 문자를 제거하는 것이 더 쉬울 수도 있습니다. 예를 들어 출력을 표준 ASCII 문자로 제한하려면 다음을 사용할 수 있습니다.

tr -dc '[^ -~\012\015]'

이렇게 하면 SPACE와 ~(문자 126) 사이의 문자와 CR/LF 문자만 보존됩니다. 다른 모든 콘텐츠는 삭제됩니다.

또는 공백과 같은 다른 문자로 바꿀 수도 있습니다.

tr -c '[^ -~\012\015]' ' '

이렇게 하면 들여쓰기 수준이 유지됩니다.

마지막으로, 이것을 볼 수도 있습니다.로케일예를 들어 운영 체제에서는 UTF8이 있다고 생각하는데 터미널에서는 그렇지 않은 경우 이 내용이 표시될 수 있습니다.

따라서 LANG=C명령을 실행하기 전에 설정하면 출력이 변경될 수 있습니다.

LANG=C strings o1_mf_d3rrgv0l_.ctl

이는 strings명령이 인쇄 가능한 문자로 간주하는 내용을 변경합니다.

답변2

흥미로운 여정을 마친 후, 이것이 GNU에 대한 귀하의 질문에 답이 되기를 바랍니다 grep.

샘플 file.txt:

▒▒▒▒
▒▒▒▒
▒▒▒▒
foo
bar
@▒^@^@▒▒^@^@^@^@^@^@^@^@^@^@<▒^@^@^@^@@^@^@^@^D~z{|}^@^@^▒^@^@^@^@^@^@^@^@^@^@

$ grep -v $(printf %b \\U2592) file.txt
foo
bar

관련 정보