Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 试图在awk中执行unix命令,但收到错误_Bash_Awk - Fatal编程技术网

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-vtu1or
cut'-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