把輸出格式化曙寡,對(duì)齊讼溺。
例如令宿,假設(shè)有json數(shù)據(jù):
[
{
"id": 1,
"name": "Joe",
"email": "joe@domain.com"
},
{
"id": 5,
"name": "Jack",
"email": "jack@domain.com"
},
{
"id": 10,
"name": "George",
"email": "george@domain.com"
}
]
希望按行輸出每一個(gè)數(shù)組內(nèi)容:
- 自然輸出
以四個(gè)空格作為分隔符輸出叼耙。
$ cat t.json | jq -r '.[] | (.id|tostring) + " " + .name + " " + .email'
1 Joe joe@domain.com
5 Jack jack@domain.com
10 George george@domain.com
這樣明顯看到數(shù)據(jù)是沒法對(duì)齊的。
- 用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
這樣就比較整齊了粒没;
但是如果其中一個(gè)字很長筛婉,例如名字很長: 100 Tom Hanks hanks.tom@domain.com
結(jié)果就是:
$ 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
這里為了說明方便,我使用了'-'作為占位符便于看清楚响蓉。這個(gè)語法我們定義:
- id字段占用5字符
- name字段占用10字符
- email字段占用20字符
- 各個(gè)字段之間用額外的兩個(gè)空格分開硕勿。
解釋一下語法(.name | ("-" * (10 - length)) + .)
的含義:
- length值得是.name的值的長度
- ("-" * (10 - length))就是字符'-'重復(fù)(10-length)次
- 最后的
.
在這里就是.name字段的值。
所以整個(gè).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
=== ===== ======