如何使用grep命令搜索ASCII控制字符

15
如果我有一个包含ASCII控制字符的文件,例如^A(标题开始),我该如何在Linux中使用grep查找它?

4
使用Bash命令:grep $'\01' 文件名 - Cyrus
1
grep '[[:cntrl:]]'?这并不清楚您是想查找一个特定的控制字符还是所有控制字符,如果找到它们,您想要输出什么。 - Ed Morton
谢谢Cyrus,对我有用。 :) - Lin Ma
@Cyrus,我看到OP提到了您的评论解决了他的问题。您可能希望发布一个答案,以便这一点更清楚。 - fedorqui
4个回答

14

正如评论中所述,下面的方法解决了该问题:

grep $'\01' file

3
啊,应该查看Bash文档而不是grep :) https://www.gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html - Eric
@Eric 确切地说:) - fedorqui
请注意,上述内容是八进制格式,如果我没有弄错的话。您还可以搜索常规转义和十六进制转义(请参见@Eric上面的注释)。要搜索FORM FEED字符,您可以使用$'\xC'$'\f',例如,请参阅此类ASCII表以获取十六进制位置。 - vlz
这似乎无法处理换行符 :( - törzsmókus
这对我不起作用(GNU grep 3.4):grep -a '[:cntrl:]grep -a $'\00'不匹配。例如,将printf "hell0\x0\nworld\n:-)\x0:-(\n"输入管道中。 - Louis Maddox

1

这可以通过启用-P选项的Perl正则表达式在grep中完成:

grep -P "\x01" file

0

此处所建议,awk可以可移植地查找控制字符。

awk '/\01/'

-1

旁注:您不需要死记硬背所有这些^something符号

- for any ^#, obtain the 3-digit octal code of 
              ASCII byte ordinance value of "#" via mapping array

- do a 1/0 invert for the left most digit : 
              125 -> 025
              077 -> 177

新值是您正在寻找的控制字节的八进制代码。这本质上就是其他人所描述的“反转第7位”。


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