Bash 试图在awk中执行unix命令,但收到错误
我有你的档案Bash 试图在awk中执行unix命令,但收到错误,bash,awk,Bash,Awk,我有你的档案 awk 'BEGIN{FS="|"; } {print $2|"od -An -vtu1"| tr -d "\n"}' test1.txt 我试图找到字段2的ascii值,但下面的命令给了我错误 1|siva 2|krishna 3| syz 5 预期产量 awk 'BEGIN{FS="|"; } {print $2|"od -An -vtu1"| tr -d "\n"}' test1.txt awk: BEGIN{FS="|"; } {print $2|"od -An
awk 'BEGIN{FS="|"; } {print $2|"od -An -vtu1"| tr -d "\n"}' test1.txt
我试图找到字段2的ascii值,但下面的命令给了我错误
1|siva
2|krishna
3| syz 5
预期产量
awk 'BEGIN{FS="|"; } {print $2|"od -An -vtu1"| tr -d "\n"}' test1.txt
awk: BEGIN{FS="|"; } {print $2|"od -An -vtu1 tr -d "\n"}
awk: ^ backslash not last character on line
听起来这就是你想要做的:
115 105 118 97
107 114 105 115 104 110 97
32 115 121 122 32 53
或者使用另一种语法,以便输出来自awk,而不是system()调用的shell:
按摩以适应。您不需要将结果保存在变量中,您可以直接打印它,但我想您会想知道如何在某个时候执行此操作,当然,您不需要打印$0
我还假设您有理由希望在awk中执行此操作,例如,它是更大脚本的一部分,否则使用awk调用系统调用shell来执行shell命令与使用shell来执行shell命令相比,这是一个坏主意
话虽如此,我能想到的最好的shell命令是使用GNU awk for mult char RS:
$ awk '
BEGIN { FS=OFS="|" }
{
cmd = "printf \047%s\047 \047" $2 "\047 | od -An -vtu1"
rslt = ( (cmd | getline line) > 0 ? line : "N/A" )
close(cmd)
print $0, rslt
}
' file
1|siva| 115 105 118 97
2|krishna| 107 114 105 115 104 110 97
3| syz 5| 32 32 115 121 122 32 53
如果输入包含
“$(command)”
,请参阅下面的注释,了解如何比第一种awk方法更健壮,但它确实假设您的输入中没有NUL字符。您实际上没有使用任何awk
,这可能更容易
$ awk -F'|' -v ORS='\0' '{print $2}' file |
od -An -vtu1 |
awk -v RS=' 0\\s' '{gsub(/\n/,"")}1'
115 105 118 97
107 114 105 115 104 110 97
32 32 115 121 122 32 53
$while IFS='|'read-r\uf;
do echo-n“$f”| od-An-vtu1;
完成<文件
115 105 118 97
107 114 105 115 104 110 97
32 32 115 121 122 32 53
您不能简单地在awk
中执行shell命令(system
就是为了它,但事实是,真的需要吗?如果不知道输入和输出的示例,我们就无法准确地告诉它)。另外,请在您的帖子中发布您的输入样本和预期输出样本,然后让我们知道?echo“test”| tr-d“\n”| od-An-vtu1输出:116 101 115 116所以我试图用awkWhy执行上述命令,为什么是“
奇数?然后尝试类似于awk'开始{FS=“|”;{print$2}'test1.txt |在读取r;do od-An-vtu1orcut'-delimiter=|'-f2 | od-An-vtu1 | sed's/10/\n/g'
时,您可能需要更加小心地警告OP代码中涉及的安全风险。“坏主意”是一个相当保守的说法。(也许向他们展示如何在不使用system()
的情况下将awk集成到预期的管道中可能更有意义?)实际上,我更多地考虑的是性能和复杂性问题。是否要添加关于安全性的注释?您正在使用字符串连接将数据替换为代码。$(rm-rf~)
在你的$2
中,会发生什么?它在单引号中(在\047
s中),所以我什么也不希望。'$(rm-rf~)'
在你的$2
中,然后会发生什么?或者更病态地说,$(rm-rf~)'$(rm-rf~)'
来涵盖这两种情况
$ awk -F'|' -v ORS='\0' '{print $2}' file |
od -An -vtu1 |
awk -v RS=' 0\\s' '{gsub(/\n/,"")}1'
115 105 118 97
107 114 105 115 104 110 97
32 32 115 121 122 32 53
$ while IFS='|' read -r _ f;
do echo -n "$f" | od -An -vtu1;
done < file
115 105 118 97
107 114 105 115 104 110 97
32 32 115 121 122 32 53