Извлечение определенных текстов из нескольких файлов json

#powershell #cmd

#powershell #cmd

Вопрос:

Итак, я пытаюсь извлечь определенную строку из нескольких файлов json и создать текстовый файл и добавить эти извлеченные строки в этот текстовый файл

Здесь каждый файл json выглядит как

 {
  "type": "service_account",
  "project_id": "mm-sxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "private_key_id": "01xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "private_key": "-----BEGIN PRIVATE KEY-----nMIIEvQIBADAhnk9P8vIQogdfdIxxxxxxx/9FqnwxeBX5Wk CRXvklQQP37TDM=n-----END PRIVATE KEY-----n",
  "client_email": "mm-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxqr.iam.gserviceaccount.com",
  "client_id": "1xxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/mm-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxqr.iam.gserviceaccount.com"
}
  

Каждый файл json имеет этот шаблон

Что меня интересует, так это эта строка "client_email": "mm-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxqr.iam.gserviceaccount.com",

Мне просто нужно электронное письмо из этой строки, т. Е. В этом случае mm-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxqr.iam.gserviceaccount.com

Я пытаюсь добиться этого в Powershell

Я попробовал решение ниже

 (Select-String -Path *json -Pattern 'client_email').Line | Set-Content AllSAEmails.txt
  

Это создало текстовый файл со следующим шаблоном

   "client_email": "mm-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxqr.iam.gserviceaccount.com",
  "client_email": "mm-yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyas.iam.gserviceaccount.com",
  "client_email": "mm-zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzae.iam.gserviceaccount.com",
  "client_email": "mm-qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqquh.iam.gserviceaccount.com"
  

Но меня интересует, как показано ниже, возможно ли создать текстовый файл с этим шаблоном?

Итак, поскольку у меня есть несколько json..у каждого из json есть такое электронное письмо .. я бы хотел, чтобы все эти электронные письма находились внутри текстового файла, разделенного запятой

 mm-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxqr.iam.gserviceaccount.com,
mm-yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyas.iam.gserviceaccount.com,
mm-zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzae.iam.gserviceaccount.com,
mm-qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqquh.iam.gserviceaccount.com
  

Любая помощь будет оценена

Спасибо

Ответ №1:

Используйте ConvertFrom-Json для разбора файла, тогда остальное становится тривиальным:

 $emails = Get-ChildItem .*.json |Get-Content -Raw |ConvertFrom-Json |Select -ExpandProperty client_email
  

Если вы хотите выводить электронные письма в файл и вставлять разрыв строки каждые 10 строк, вы могли бы сделать что-то вроде:

 @(
  for($i = 0;$i -lt $email.Length ;$i  = 10){
    # output 10 emails and a blank string
    $emails[$i..($i   9)]
    ""
  }
) |Set-Content .pathtofile
  

Комментарии:

1. Это просто потрясающе .. я протестировал это, и это сработало хорошо .. у меня также есть небольшой запрос .. могу ли я добавить пустую строку после каждых 10 lines..is это также можно добавить в ту же команду, что и выше, благодаря @Mathias R. Jessen

2. Вы имеете в виду, что если вы впоследствии выводите $emails в файл, вам нужен разрыв строки для каждых 10?

3. да, точно $emails = Get-ChildItem .*.json |Get-Content -Raw |ConvertFrom-Json |Select -ExpandProperty client_email >>emails.txt я использовал это для создания файла