Você pode usar o comando grep para corresponder aos padrões necessários e sort para filtrar as duplicatas. Se o seu arquivo de entrada for input.json e a saída for usernames.txt :
grep -P -o '(?<="username":")[^"]*' input.json | sort -u > usernames.txt
Quebrando:
-
grepé um utilitário de linha de comando para corresponder expressões regulares em um arquivo. Expressões regulares são uma maneira poderosa de descrever partes do texto que você deseja encontrar -
-Pinformagreppara usar "Expressões regulares compatíveis com Perl". Note que a página man do grep descreve isso como "altamente experimental"! -
-odiz agreppara produzir apenas o texto correspondente. Por padrão,grepnormalmente produziria toda a linha sempre que uma correspondência fosse encontrada. -
'(?<="username":")[^"]*'é a expressão regular em si:- Colocamos em aspas simples
'....'para impedir que o shell da linha de comando tente interpretar qualquer coisa nele -
(?<=...)é o que é chamado de asserção lookbehind . Ele diz que queremos corresponder"username":"antes de outra coisa, mas não incluí-lo na saída -
[^"]*significa "o maior número possível de caracteres que não são". Pode ser dividido novamente: -
[..]é uma classe de caracteres. Qualquer caractere colocado entre colchetes é permitido neste momento. A menos que ... -
^"Quando você usa um caret^como primeiro caractere em uma classe de caracteres, isso significa não nenhum dos seguintes caracteres -
*significa 0 ou mais do item anterior (que é o total de[^"]neste caso).
- Colocamos em aspas simples
Pipar o lote em sort classifica os nomes de usuários em ordem alfabética, o que, com a opção -u , significa "somente itens exclusivos", ou seja, sem duplicatas.
Nota: Tudo isso pressupõe que o padrão que estamos combinando não pode ocorrer em nenhum outro lugar no arquivo (o que parece improvável) ou que o quebrantamento do próprio JSON não fará com que a correspondência falhe (o que pode Não sei ao certo como o seu arquivo está quebrado).
EDITAR:
Com grep reclamando regularmente que as linhas eram muito longas e, por algum motivo, sed -e 's/,/,\n/' não estava funcionando, o comando split foi usado para dividir o arquivo em partes mais gerenciáveis.