对“NAK”字符执行grep

时间:2018-01-18 16:08:38

标签: linux grep

我正在尝试对包含“NAK”字符(http://www.theasciicode.com.ar/ascii-control-characters/nak-negative-acknowledge-ascii-code-21.html)的文件执行grep。

当我用vi打开文件时,此NAK字符显示为“^ U”。我试过foo: bar ,但它不起作用。

你知道如何识别这个字符以匹配grep命令吗?

3 个答案:

答案 0 :(得分:1)

  

我尝试了grep ^U myfile.csv,但它不起作用。

要grep Control-U字符,您不得键入图形表示 ^ U 作为模式;输入文字Control-U代替。为此,您必须在其前面加上 quoted-insert 特殊键Control-V,i。即键入 Ctrl - V Ctrl - U

答案 1 :(得分:0)

#od -c can identify those non-printable character and represent them in octal

echo "$line"| od -c;

答案 2 :(得分:0)

让我们制作一个包含前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,(十六进制15),在上下文中查看它的最简单方法是将十六进制重组为单个字节(-g1),然后查找{{1}在开始和结束时使用单词边界,这样您只能在十六进制部分找到15,而不是在每行开头的偏移中找到,而不是在每行末尾的ASCII部分中找到:

15

00000010:10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f ................

现在你可以看到它和周围的人物了。为了使它更清晰,让我们想象你正在寻找{16}的xxd -g1 a | grep "\b15\b"

A

您现在可以在第三个字段中看到xxd -g1 a | grep "\b41\b" 00000040: 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f @ABCDEFGHIJKLMNO ,还可以在该行的末尾(右侧)看到ASCII部分中41周围的字母。

另一种找到A但可能输出一堆控制字符的方法正如我在评论中所说:

NAK

搜索控制字符时的另一个“技巧”是将它们转换为其他字符,然后查找它。因此,选择文件中不会出现太多内容的内容,可能是grep -a $'\x15' someFile |,将您的NAK转换为该内容,然后搜索该内容。

作为具体示例,让我们将麻烦的NAK转换为管道符号#,然后搜索:

|

或者,假设您的文件中包含ACK和NAK,请将其转换为tr '\015' '|' < YourFile | grep -a '|' <并搜索以下任一项:

>