Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.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
Linux 为什么awk模式匹配不返回结果?_Linux_Bash_Shell_Unix_Awk - Fatal编程技术网

Linux 为什么awk模式匹配不返回结果?

Linux 为什么awk模式匹配不返回结果?,linux,bash,shell,unix,awk,Linux,Bash,Shell,Unix,Awk,创建一个包含以下1行的文件(x): {"dagId":"blashj","execDate":"20190426","status":"running","isActive":true} -->返回所需的值-->true -->为什么不返回一个值??所需值--->正在运行 cat x | sed -e 's/[{}"]/''/g' | awk -v RS=',' -F: '/^\status/ {print $0}' env是RHEL7.4,GNU Awk 4.0.2,这将是因为\s不匹配?

创建一个包含以下1行的文件(x):

{"dagId":"blashj","execDate":"20190426","status":"running","isActive":true}
-->返回所需的值-->true

-->为什么不返回一个值??所需值--->正在运行

cat x | sed -e 's/[{}"]/''/g' | awk -v RS=',' -F: '/^\status/ {print $0}'

env是RHEL7.4,GNU Awk 4.0.2,这将是因为
\s
不匹配?

我将全力支持
jq
,它应该在您的平台上提供:

jq -r '"isActive:"+(.isActive | tostring)' file
如果您只需要对象属性的该值,它可以简单到

jq -r '.status'  file
-r
-raw output
将字符串直接写入标准输出,而不是格式化为带引号的JSON字符串


看。使用正确的工具可以节省时间。

如果像我一样,您在工作中无法访问
jq
,我会使用正则表达式作为
awk
记录分隔符

$awk-F:-vrs='[{},]''/“isActive”/{print$2}'x
真的
$awk-F:-vrs='[{},]''/'状态”/{print$2}'x
“跑步”

为什么不使用
jq
解析json数据?请将该示例输入的所需输出添加到您的问题中。为什么要转义regexps中的
i
s
字符?我的理解是/^\isActive/将查找以isActive开头的行,它返回另一个模式有什么不同呢?
/^\status/
说“查找一行,该行以空格(
\s
)开头,后跟字符串
tatus
”c.f.用于转义序列列表。它在RHEL5框上正常工作,但在RHEL7上行为必须已更改,因为与空格匹配的转义序列特定于gawk。可能您以前运行的是非gnu awk,
\s
将与
s
匹配,但在新系统中您使用的是gnu awk。您可以添加
——传统的
,如果它开始工作,您就会知道原因。看@tooptoop4我觉得你错过了真正的要点,那就是——不要那样做!如果您不希望
[:space://code>的意思是
s
而只是不转义
s,那么您就不必担心正在执行哪个awk版本或传递哪个标志。如果要在regexp中使用字符
s
,只需编写
s
,而不是
\s
。wrt
/^\isActive/将查找以isActive开头的行
-嗯,是的,但是
/^isActive/
也将如此,因为
\i
\i
的意思相同(除非有人提出awk版本或某一天,
\i
具有特殊意义!)
jq -r '.status'  file