procurando por padrões especializados usando grep em um arquivo json

1

Gostaria de saber como é que só posso usar o "created_at": aqueles que são seguidos por} e uma nova linha como a seguinte:

        "hashtags": [],
        "urls": []
    },
    "created_at": "Wed Oct 19 22:19:42 +0000 2016",
    "retweeted": false,
    "coordinates": null,
    "in_reply_to_user_id_str": null,
    "source": "<a href=\"http://tweetlogix.com\" rel=\"nofollow\">Tweetlogix</a>",
    "in_reply_to_status_id_str": null,
    "in_reply_to_screen_name": null,
    "in_reply_to_user_id": null,
    "place": null,
    "retweet_count": 0,
    "id_str": "788867246953201664"
},
{
    "favorited": false,
    "contributors": null,
    "truncated": false,
    "text": "Reddit Exposes Hillary Clinton Staff Trying To Frame Assange As \u2018Pedo\u2019 https://t.co/KNj14p8QqN via @yournewswire",
    "possibly_sensitive": false,
    "is_quote_status": false,
    "in_reply_to_status_id": null,
    "user": {
        "follow_request_sent": false,
        "has_extended_profile": false,
        "profile_use_background_image": true,
        "time_zone": "Eastern Time (US & Canada)",

Inicialmente, eu estava usando grep -wirnE 'Wed Oct 19 2(1:[0-5][0-9]:[0-5][0-9]|2:([0-2][0-9]:[0-5][0-9]|30:00)) .* 2016' * > results_created_at e, em seguida, usando wc -l results_created_at para contar o número de tweets que foram criados nesse intervalo de tempo específico. No entanto, podemos ter imagens de perfil ou usuários que também foram criados nesse intervalo de tempo. Então, eu gostaria de saber como procurar somente tweets usando o comando grep inicial que eu tinha?

Eu tenho procurado em muitos dos tweets em meus arquivos e parece em todos os quais,}, \ n (novas linhas) é seguido por "created_at": e, em seguida, algumas linhas depois que temos o texto.

    
por Mona Jalal 15.01.2018 / 22:11

1 resposta

1

Adicionar -z às suas opções grep fará com que o grep trate as novas linhas como caracteres de terminação nula ( .* ), ao contrário de linhas separadas, mas elas não parecem ser passíveis de serem encontradas na regex. A solução para isso é simplesmente combinar tudo ( -o ) até o final do padrão desejado (no seu caso "created_at").

Em seguida, você pode adicionar wc -l para fazer com que o grep só exiba o que é realmente correspondido, caso contrário, ele exibe o arquivo inteiro (já que agora é essencialmente uma linha gigante). Alternativamente, se a única finalidade de produzir para um arquivo é, posteriormente, -c , sugiro que você use a opção %code% do grep, que imprimirá o número de correspondências em vez da correspondência em si.

Isso se traduz ao seguinte comando:

grep -wirnEzc '},.*created_at' *

Expandindo isso para incluir seu padrão anterior, também obtemos:

grep -wirnEzc '},.*created_at":\s"Wed Oct 19 2(1:[0-5][0-9]:[0-5][0-9]|2:([0-2][0-9]:[0-5][0-9]|30:00)) .* 2016' *
    
por Dude Random21 15.01.2018 / 23:46