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 -
-P
informagrep
para usar "Expressões regulares compatíveis com Perl". Note que a página man do grep descreve isso como "altamente experimental"! -
-o
diz agrep
para produzir apenas o texto correspondente. Por padrão,grep
normalmente 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.