Ubuntu 16.04
bash -version
GNU bash, version 4.4.0(1)-release (x86_64-unknown-linux-gnu)
我想要grep
2 种模式,然后将它们并排列出。目前,这就是我所拥有的:
root@tires ~ # grep -e tire_id -e appID /path/to/*/vehicle/production.json
/path/to/000001_000002/vehicle/production.json: "tire_id": "1305436516186552",
/path/to/000001_000002/vehicle/production.json: "appID": "1164562920689523",
/path/to/000001_000079/vehicle/production.json: "tire_id": "1815123428733289",
/path/to/000001_000079/vehicle/production.json: "appID": "18412365908966538",
/path/to/000001_000088/vehicle/production.json: "tire_id": "138477888324",
这就是我想要的,尽管任何类似的东西实际上都可以。
root@tires ~ # grep -e tire_id -e appID /path/to/*/vehicle/production.json
/path/to/000001_000002/vehicle/production.json: tire_id: 1305436516186552, appID: 1164562920689523
/path/to/000001_000079/vehicle/production.json: tire_id: 1815123428733289, appID: 18412365908966538
此处的文件示例:
{
"socal": "https://xxx.xxxxx.xxx",
"ip": "xxx.xxx.xxx.xxx",
"tire_id": "213275925375485",
"client": {
"platform": "xx",
"clientID": "xxxxx",
"serviceID": "xxxxx",
"service_id": XXXX,
"vendor": "default"
},
"locale": "en_US",
"cdc": {
"appID": "233262274090443",
"isdel": "ORdiZBMAQS2ZBCnTwZDZD",
},
"attachments": {
"output": "attachments",
"public": false,
},
}
jq
使用有效 JSON 文档的工具的正确方法:样品
file1.json
:样品
file2.json
:以及解决方案本身:
输出:
你可以这样做,
grep
但它相当复杂,罗曼的答案实际上更好。您的示例内容仅来自一个文件,因此只有一次
tire_id
and的实例appID
。用这个:
echo
使用命令替换将所有内容放在同一行。egrep
做同样的事情,grep -e
但是允许你把所有的字符串放在一起,|
而不是-e string
每次都使用。sed -e 's|"||g'
删除撇号。sed -e 's|,||2
appID
从所需输出中显示的值的末尾删除逗号。输出:
/path/to/production.json
并且/path/to/production2.json
只是占位符。这显然需要大量修改,因为您必须分别 grep 每个文件并为每个文件使用
echo
命令替换。grep
如果您坚持使用,或者将来它不是json
文件,我只会包含它。使用 sed 脚本:
重新运行
如果每一行“tire_id”后跟一行“appID”,它就可以工作。否则,您需要更复杂的 sed 脚本
即使在文件中缺少“tire_id”或“appID”行,此命令也可以工作。它不会显示: