我有一个数据,我正在尝试获取各种方法,结果是
[
"created:Alpha;DateCreated:12/12/2022;TicketNo:XXXX_XXX;ProductName:websphere;OStype:Linux"
]
我想获取Linux
上面我尝试使用的操作系统类型JQ
,但没有成功。有什么建议
谢谢
拉吉
答案1
这是使用 pure 处理输入的另一种方法jq
:
$ jq '.[] / ";" | reduce .[] as $item ({}; . + ($item / ":" | {(.[0]): (.[1])}))' file
{
"created": "Alpha",
"DateCreated": "12/12/2022",
"TicketNo": "XXXX_XXX",
"ProductName": "websphere",
"OStype": "Linux"
}
然后您可以直接提取所需的字段:
jq -r '.[] / ";" | reduce .[] as $item ({}; . + ($item / ":" | {(.[0]): (.[1])})) | .OStype' file
Linux
答案2
如果您的数据如下所示,那就容易多了:
[
{
"created": "Alpha",
"DateCreated": "12/12/2022",
"TicketNo": "XXXX_XXX",
"ProductName": "websphere",
"OStype": "Linux"
}
]
由此,我们可以使用如下方式选出OStype
顶级数组的第一个元素中键的值:jq
jq -r 'first.OStype'
那么我们如何将您的数据转化为更易于管理的形式呢?好吧,我们首先用分号分割数组中的字符串,然后再次用冒号分割:
$ jq -r 'map(split(";"))' file
[
[
"created:Alpha",
"DateCreated:12/12/2022",
"TicketNo:XXXX_XXX",
"ProductName:websphere",
"OStype:Linux"
]
]
$ jq 'map(split(";")|map(split(":")))' file
[
[
[
"created",
"Alpha"
],
[
"DateCreated",
"12/12/2022"
],
[
"TicketNo",
"XXXX_XXX"
],
[
"ProductName",
"websphere"
],
[
"OStype",
"Linux"
]
]
]
然后,我们将第一个元素指定为 the ,将第二个元素指定为 the ,然后通过from_entries
函数 (?) in将每个子子数组转换为键值对,然后看...jq
key
value
$ jq 'map(split(";")|map(split(":")) | map({key:.[0],value:.[1]})|from_entries)' file
[
{
"created": "Alpha",
"DateCreated": "12/12/2022",
"TicketNo": "XXXX_XXX",
"ProductName": "websphere",
"OStype": "Linux"
}
]
jq
然后要么将其传送到此处答案中的第一个命令,要么将其合并到我们已有的命令中:
$ jq -r 'map(split(";")|map(split(":")) | map({key:.[0],value:.[1]})|from_entries) | first.OStype' file
Linux
是的,如果我们想将所有数据转换为更有用的东西(可能用于其他用途,而不是从中提取单个值),那么这很有用。但是,如果我们想要进入并获取该Linux
字符串而不将所有内容都转换为美观的 JSON 对象怎么办?我们可以通过调用上面的列表列表轻松完成此操作select()
。只需选出第一个元素是字符串的子子数组的第二个元素OSType
:
$ jq -r 'map(split(";")|map(split(":"))) | first[] | select(.[0] == "OStype")[1]' file
Linux
或者,如果您可以完全控制这些字符串的顺序并且知道您要查找的值是最后的该键值对字符串中的值,这意味着我们不必在所有子子数组中查找它:
$ jq -r 'map(split(";")|map(split(":"))) | first[-1][1]' file
Linux
OStype:
或者,如果您想使用正则表达式,只需捕获字符串中后面的字符串:
$ jq -r 'map(capture("OStype:(?<OStype>[^;]+)")) | first.OStype' file
Linux
不管怎样,如果你想这样做的话jq
。
答案3
只需Perl
:
$ perl -MJSON::XS -MFile::Slurp -E '
my $json = read_file("json");
$json = decode_json $json;
$_ = $json->[0];
s/.*OStype://;
say
'
返回:
Linux
和gron
和GNU grep
:
$ gron file | grep -oP 'created:.*OStype:\K\w+'
Linux
与gron
和Perl
:
$ gron file | perl -nE 'say $& if /created:.*OStype:\K\w+/'
Linux
或者与jq
和GNU grep
:
$ jq '.[]' | grep -oP 'created:.*OStype:\K\w+'