使用 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

相关内容