我正在尝试对包含“NAK”字符(http://www.theasciicode.com.ar/ascii-control-characters/nak-negative-acknowledge-ascii-code-21.html)的文件执行grep。
当我用vi打开文件时,此NAK字符显示为“^ U”。我试过foo: bar
,但它不起作用。
你知道如何识别这个字符以匹配grep命令吗?
答案 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 '|'
和<
并搜索以下任一项:
>