打印(printf
)与字符\0
:awk '{printf("%s\0", $0)}'
直接打印ASCII 0
:awk '{ printf("%s%c", $0, 0)}'
测试所有与此代码替代:
#!/bin/bash
test1(){ # '{printf("%s%c",$0,0)}'|
a='awk,mawk,original-awk,busybox awk'
IFS=',' read -ra line <<<"$a"
for i in "${line[@]}"; do
printf "%14.12s %40s" "$i" "$1"
echo -ne "a\nb\nc\n" |
$i "$1"|
od -cAn;
done
}
#test1 '{print}'
test1 'BEGIN { ORS = "\0" } ; { print $0 }'
test1 '{ printf "%s\0", $0}'
test1 '{ printf("%s%c", $0, 0)}'
,我们得到这样的结果:
awk BEGIN { ORS = "\0" } ; { print $0 } a \0 b \0 c \0
mawk BEGIN { ORS = "\0" } ; { print $0 } a b c
original-awk BEGIN { ORS = "\0" } ; { print $0 } a b c
busybox awk BEGIN { ORS = "\0" } ; { print $0 } a b c
awk { printf "%s\0", $0} a \0 b \0 c \0
mawk { printf "%s\0", $0} a b c
original-awk { printf "%s\0", $0} a b c
busybox awk { printf "%s\0", $0} a b c
awk { printf("%s%c", $0, 0)} a \0 b \0 c \0
mawk { printf("%s%c", $0, 0)} a \0 b \0 c \0
original-awk { printf("%s%c", $0, 0)} a \0 b \0 c \0
busybox awk { printf("%s%c", $0, 0)} a b c
正如上面可以看出,前两种解决方案在GNU AWK才起作用。
最便携的是第三种解决方案:'{ printf("%s%c", $0, 0)}'
。
没有解决方案在“busybox awk”中正常工作。
用于此测试的版本是:
awk> GNU Awk 4.0.1
mawk> mawk 1.3.3 Nov 1996, Copyright (C) Michael D. Brennan
original-awk> awk version 20110810
busybox> BusyBox v1.20.2 (Debian 1:1.20.0-7) multi-call binary.
目前为止发现的最佳指南:http://sandrotosi.blogspot.com/2011/09/print-nul-terminated-string-with-awk.html - 但这并不是一个完整的答案,而且随机的blogspot博客的搜索引擎优化比SO更少,所以一个好的答案对更多的人会有用。 – 2012-02-03 18:06:48
尝试'awk -F $'\ 0'' – Kevin 2012-02-03 18:13:38
凯文:想把它变成答案吗? – 2012-02-03 18:16:17