我正在尝试对包含“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/