Linux 为什么awk模式匹配不返回结果?
创建一个包含以下1行的文件(x):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不匹配?
{"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