把输出格式化,对齐。
例如,假设有json数据:
[
{
"id": 1,
"name": "Joe",
"email": "joe@domain.com"
},
{
"id": 5,
"name": "Jack",
"email": "jack@domain.com"
},
{
"id": 10,
"name": "George",
"email": "george@domain.com"
}
]
希望按行输出每一个数组内容:
- 自然输出
以四个空格作为分隔符输出。
$ cat t.json | jq -r '.[] | (.id|tostring) + " " + .name + " " + .email'
1 Joe joe@domain.com
5 Jack jack@domain.com
10 George george@domain.com
这样明显看到数据是没法对齐的。
- 用tab键分割输出
$ cat t.json | jq -r '.[] | (.id|tostring) + "\t" + .name + "\t" + .email'
1 Joe joe@domain.com
5 Jack jack@domain.com
10 George george@domain.com
这样就比较整齐了;
但是如果其中一个字很长,例如名字很长: 100 Tom Hanks hanks.tom@domain.com
结果就是:
$ cat t.json | jq -r '.[] | (.id|tostring) + "\t" + .name + "\t" + .email'
1 Joe joe@domain.com
5 Jack jack@domain.com
10 George george@domain.com
100 Tom Hanks hanks.tom@domain.com
可以看到Tom Hanks的名字过长,占用了其他行属于email的位置。
另外,使用tab键分割还有另外一种写法:
$ cat t.json | jq -r '.[] | "\(.id|tostring)\t\(.name)\t\(.email)"'
1 Joe joe@domain.com
5 Jack jack@domain.com
10 George george@domain.com
100 Tom Hanks hanks.tom@domain.com
- 指定列长度
$ cat t.json | jq -r '.[] | (.id | tostring | ("-" * (5 - length)) + .) + " " + (.name | ("-" * (10 - length)) + .) + " " + (.email | ("-" * (20 - length)) + .)'
----1 -------Joe ------joe@domain.com
----5 ------Jack -----jack@domain.com
---10 ----George ---george@domain.com
--100 -Tom Hanks hanks.tom@domain.com
这里为了说明方便,我使用了'-'作为占位符便于看清楚。这个语法我们定义:
- id字段占用5字符
- name字段占用10字符
- email字段占用20字符
- 各个字段之间用额外的两个空格分开。
解释一下语法(.name | ("-" * (10 - length)) + .)
的含义:
- length值得是.name的值的长度
- ("-" * (10 - length))就是字符'-'重复(10-length)次
- 最后的
.
在这里就是.name字段的值。
所以整个.name占用10字符长度,前缀-
占用10-length(.name)长度,余下的正好就是.name自己的长度。
- 使用@tsv
$ cat t.json | jq -r '.[] | [.id, .name, .email] | @tsv'
1 Joe joe@domain.com
5 Jack jack@domain.com
10 George george@domain.com
100 Tom Hanks hanks.tom@domain.com
可以加表头:
$ cat t.json | jq -r '["ID", "NAME", "EMAIL"], ["----", "------", "------"], (.[] | [.id, .name, .email]) | @tsv'
ID NAME EMAIL
---- ------ ------
1 Joe joe@domain.com
5 Jack jack@domain.com
10 George george@domain.com
100 Tom Hanks hanks.tom@domain.com
也可以加表尾:
$ cat t.json | jq -r '["ID", "NAME", "EMAIL"], ["----", "------", "------"], (.[] | [.id, .name, .email]), ["===", "=====", "======"] | @tsv'
ID NAME EMAIL
---- ------ ------
1 Joe joe@domain.com
5 Jack jack@domain.com
10 George george@domain.com
100 Tom Hanks hanks.tom@domain.com
=== ===== ======
网友评论