如何从Shell中提取第一个空字符后提取文件中的所有内容

时间:2019-02-14 17:58:32

标签: linux shell

我有一个看起来像这样的文件:some ascii stuff\0some more ascii stuff\0and a little more ascii stuff\0

我想提取第一个\0之后的所有内容。因此,在此过程之后,我的输出为some more ascii stuff\0and a little more ascii stuff\0

我将如何去做?这是在initramfs中完成的,因此我对命令的访问受到一定限制。我确实有cutgrepawk一直在努力找工作,但我没有运气。

此实用程序主要是busybox,而sh用于外壳程序

5 个答案:

答案 0 :(得分:3)

轻松完成,只需要shell内置程序即可(cat不是内置程序,但是您可以将其替换为流的实际使用者)

{ IFS= read -r -d '' _; cat; } <yourfile

read -d ''一次读取一个字节,直到stdin上的第一个NUL。因此,该流中剩下的就是该NUL 之后的所有内容。


您可以如下进行测试:

printf '%s\0' one two three | { IFS= read -r -d '' _; hexdump -C; }

...可以正确发射:

00000000  74 77 6f 00 74 68 72 65  65 00                    |two.three.|
0000000a

答案 1 :(得分:1)

使用gnu awk,您可以这样做:

awk -F '\\0' 'NR == 1{sub($1 FS, "")} 1' file

some more ascii stuffand a little more ascii stuff

使用od -c验证输出:

awk -F '\\0' 'NR == 1{sub($1 FS, "")} 1' file | od -c

0000000   s   o   m   e       m   o   r   e       a   s   c   i   i
0000020   s   t   u   f   f  \0   a   n   d       a       l   i   t   t
0000040   l   e       m   o   r   e       a   s   c   i   i       s   t
0000060   u   f   f  \0  \n
0000065

答案 2 :(得分:1)

如果您有grep,那么您很可能也已经过sed。 这对我有用:

echo -e "one\000two\000three" | sed 's/[^\o000]*\o000//'

答案 3 :(得分:0)

我会使用perl

perl -n0e 'print unless $.==1'

-0将记录分隔符设置为空字节,并且打印内容将打印除第一条记录以外的所有内容。

答案 4 :(得分:0)

这是否适合您取决于您​​当时可用的awk版本...对于我来说适用于w / GNU awk 4.1.3

echo -e 'some ascii stuff\0some more ascii stuff\0and a little more ascii stuff\0'| awk 'BEGIN{RS="\0";ORS="\t"} NR>1{print $0}'
some more ascii stuff   and a little more ascii stuff