我正在尝试对包含“NAK”字符的文件执行grep(http://www.theasciicode.com.ar/ascii-control-characters/nak-negative-acknowledge-ascii-code-21.html)。
当我用vi打开文件时,这个NAK字符显示为“^U”。我试过了,但没用。
你知道我如何识别这个字符来匹配grep命令吗?

最佳答案

让我们制作一个包含前128个ASCII代码的小文件来演示:

perl -e 'for($i=0;$i<128;$i++){printf("%c",$i)}' > someFile

用十六进制来表示:
xxd someFile

00000000: 0001 0203 0405 0607 0809 0a0b 0c0d 0e0f  ................
00000010: 1011 1213 1415 1617 1819 1a1b 1c1d 1e1f  ................
00000020: 2021 2223 2425 2627 2829 2a2b 2c2d 2e2f   !"#$%&'()*+,-./
00000030: 3031 3233 3435 3637 3839 3a3b 3c3d 3e3f  0123456789:;<=>?
00000040: 4041 4243 4445 4647 4849 4a4b 4c4d 4e4f  @ABCDEFGHIJKLMNO
00000050: 5051 5253 5455 5657 5859 5a5b 5c5d 5e5f  PQRSTUVWXYZ[\]^_
00000060: 6061 6263 6465 6667 6869 6a6b 6c6d 6e6f  `abcdefghijklmno
00000070: 7071 7273 7475 7677 7879 7a7b 7c7d 7e7f  pqrstuvwxyz{|}~.

现在,如果您想找到NAK,(hex 15),在上下文中最简单的方法是将hex重新组合成单个字节(-g1),然后在开始和结束处查找带有单词边界的15,这样您只能在hex部分找到15,而不是在每行开始处的偏移处,而不是在每行结束处的ASCII部分:
xxd -g1 a | grep "\b15\b"

00000010:10 11 12 13 14 15 16 17 18 1a 1b 1c 1d 1e 1f。。。。。。。。。。。。。。。。
现在你可以看到它和它周围的人物。为了更清楚一点,让我们假设您正在寻找A,即hex 41:
xxd -g1 a | grep "\b41\b"
00000040: 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  @ABCDEFGHIJKLMNO

现在,您可以在第三个字段中看到41,也可以在行末尾(右侧)的ASCII部分中看到A周围的字母。
另一个可以找到NAK但可能输出大量控制字符的方法如我在注释中所说:
grep -a $'\x15' someFile

搜索控制字符时的另一个“诀窍”是将它们转换为其他字符,然后进行查找。所以,选择一些在文件中不会出现太多的内容,可能是a|或a#,将nak转换为该内容,然后搜索该内容。
作为一个具体的例子,我们将麻烦的nak转换为管道符号|,然后搜索:
tr '\015' '|' < YourFile | grep -a '|'

或者,假设您的文件中有ack和nak,将它们转换为<>并搜索:
tr '\006\015' '<>' < YourFile | grep -Ea '<|>'

关于linux - 对“NAK”字符执行grep,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48325580/

10-15 02:57