Ubuntu 16.04
bash -version
GNU bash, version 4.4.0(1)-release (x86_64-unknown-linux-gnu)
Eu gostaria grep
de 2 padrões e, em seguida, tê-los listados lado a lado. No momento, isso é o que eu tenho:
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",
Isso é o que eu gostaria de ter, embora qualquer coisa semelhante funcione na verdade.
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
Exemplo de arquivo aqui:
{
"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,
},
}
O caminho certo com a
jq
ferramenta para documentos JSON válidos:Amostra
file1.json
:Amostra
file2.json
:E a solução em si:
A saída:
Você pode fazer isso com
grep
, mas é bastante complicado e a resposta de Roman é realmente melhor.Seu conteúdo de exemplo é apenas de um arquivo, portanto, há apenas uma instância de
tire_id
eappID
.Usa isto:
echo
coloca tudo na mesma linha com substituição de comando.egrep
faz a mesma coisa quegrep -e
mas permite que você coloque todas as strings juntas separadas por|
em vez de ter que usar-e string
cada vez.sed -e 's|"||g'
remove os apóstrofos.sed -e 's|,||2
remove a vírgula do final do valor paraappID
o qual é mostrado na saída desejada.Resultado:
/path/to/production.json
e/path/to/production2.json
são apenas espaços reservados.Isso obviamente requer muitas modificações, pois você teria que grep cada arquivo separadamente e usar uma
echo
substituição de comando para cada um. Só estou incluindo se você insistir em usargrep
ou se no futuro não for umjson
arquivo.Com um script sed:
Refazer
funciona se cada linha "tire_id" for seguida por uma linha "appID". Caso contrário, você precisa de um script sed mais complexo
Este comando funcionará mesmo que em um arquivo ele perca uma linha "tire_id" ou "appID". Não será exibido: