我有一个看起来像这样的文件: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中完成的,因此我对命令的访问受到一定限制。我确实有cut
,grep
和awk
一直在努力找工作,但我没有运气。
此实用程序主要是busybox,而sh
用于外壳程序
答案 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