如何在文件中查找非可打印字符?

11

我尝试在Unix中查找数据文件中的不可打印字符。 代码:

#!/bin/ksh
export SRCFILE='/data/temp1.dat'
while read line 
do
len=lenght($line)
for( $i = 0; $i < $len; $i++ ) {

        if( ord(substr($line, $i, 1)) > 127 )
        {
            print "$line\n";
            last;
        }
done < $SRCFILE

代码不起作用,请帮我找到解决此问题的方案。


2
可能是如何在UNIX中使用grep匹配所有非ASCII字符的重复问题。 - kenorb
也是重复的问题: 查找并删除带有非 ASCII 名称的文件 - kenorb
3个回答

16

你可以使用grep在文件中查找非打印字符,例如以下命令可以查找所有的非打印ASCII和非ASCII字符:

grep -P -n "[\x00-\x1F\x7F-\xFF]" input_file

-P选项提供更强大的Perl正则表达式(PCREs),-n选项显示行号。

如果你的grep不支持PCREs,直接使用Perl就可以了:

perl -ne '$x++;if($_=~/[\x00-\x1F\x7F-\xFF]/){print"$x:$_"}' input_file

谢谢您的信息,但是grep命令没有起作用。实际上,我想在文件中查找非可打印字符。如果您能帮忙就太好了。 - user3759763
范围\x80-\xFF涵盖了非ASCII字符,但OP要求不可打印的字符,在ASCII上下文中也包括\x00-\x1F - rlandster
第一个 grep 缺少一个 'x'。我无法编辑只更改一个字符。 - bjornruffians
@bjornruffians:谢谢你,我已经添加了 x - paxdiablo

12

你可以尝试类似这样的方法:

grep '[^[:print:]]' filePath

你能提供文件的一部分作为示例吗?再次,您想显示包含那些字符或?的行吗? - blackSmith
嗨,史密斯,请查看以下记录。 - user3759763
ABC|111112 | 尝试 | 印度 | 澳大利亚 | 英国 ABC|222222 | 尝试失败 ^Z | 印度 | 澳大利亚 | 英国 ABC|333333 | 尝试 | 印度 | 澳大利亚 | 英国 ABC|444444 | 错误 ^Z | 印度 | 澳大利亚 | 英国 - user3759763
在上述记录中,我需要填充记录#2和4,因为它们包含不可打印字符,而记录1和3看起来很好。 - user3759763
3
如果您不想包含空格/制表符,则需要使用[^[:print:][:blank:]] - rveach

-3
这听起来很陈词滥调,但我现在不确定该怎么做。 我已经喜欢上了“od”,根据你所做的事情,你可能需要适合打印任意字符的东西。awk代码并不是非常优雅,但如果你正在寻找具体的内容,它是灵活的,重点只是展示od的使用。请注意awk比较和空格等问题。
cat filename | od -A n -t x1z | awk '{ p=0; i=1; if ( NF>16) { while (i<17) {if ( $i!="0d"){ if ( $i!="0a") {if ( $i" " < "20 " ) {print $i ; p=1;}  if ( $i" "> "7f "){print $i;   p=1;}}}  i=i+1} if (p==1) print $0; }}' | more

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接