Отфильтруйте результаты, используя bash - PullRequest
0 голосов
/ 03 марта 2020

Чтобы быть более понятным, посмотрите на текстовый файл ниже.

https://brianbrandt.dk/web/var/www/public_html/.htpasswd
https://brianbrandt.dk/web/var/www/public_html/wp-config.php
https://briannajackson1.wordpress.org/high-entropy-misc.txt
https://briannajackson1.wordpress.org/Homestead.yaml
https://brickellmiami.centric.hyatt.com/dev
https://brickellmiami.centric.hyatt.com/django.log
https://brickellmiami.centric.hyatt.com/.dockercfg
https://brickellmiami.centric.hyatt.com/docker-compose.yml
https://brickellmiami.centric.hyatt.com/.docker/config.json
https://brickellmiami.centric.hyatt.com/Dockerfile
https://brideonashoestring.wordpress.org/web/var/www/public_html/config.php
https://brideonashoestring.wordpress.org/web/var/www/public_html/wp-config.php
https://brideonashoestring.wordpress.org/wp-config.php
https://brideonashoestring.wordpress.org/.wp-config.php.swp
https://brideonashoestring.wordpress.org/_wpeprivate/config.json
https://brideonashoestring.wordpress.org/yarn-debug.log
https://brideonashoestring.wordpress.org/yarn-error.log
https://brideonashoestring.wordpress.org/yarn.lock
https://brideonashoestring.wordpress.org/.yarnrc
https://bridgehome.adobe.com/etc/shadow
https://bridgehome.adobe.com/phpinfo.php
https://bridgetonema.wordpress.org/manifest.json
https://bridgetonema.wordpress.org/manifest.yml
https://bridge.twilio.com/.wp-config.php.swp
https://bridge.twilio.com/wp-content/themes/.git/config
https://bridge.twilio.com/_wpeprivate/config.json
https://bridge.twilio.com/yarn-debug.log
https://bridge.twilio.com/yarn-error.log
https://bridge.twilio.com/yarn.lock
https://bridge.twilio.com/.yarnrc
https://brightside.mtn.co.za/config.lua
https://brightside.mtn.co.za/config.php
https://brightside.mtn.co.za/config.php.txt
https://brightside.mtn.co.za/config.rb
https://brightside.mtn.co.za/config.ru
https://brightside.mtn.co.za/_config.yml
https://brightside.mtn.co.za/console
https://brightside.mtn.co.za/.credentials
https://brightside.mtn.co.za/CVS/Entries
https://brightside.mtn.co.za/CVS/Root
https://brightside.mtn.co.za/dasbhoard/
https://brightside.mtn.co.za/data
https://brightside.mtn.co.za/data.txt
https://brightside.mtn.co.za/db/dbeaver-data-sources.xml
https://brightside.mtn.co.za/db/dump.sql
https://brightside.mtn.co.za/db/.pgpass
https://brightside.mtn.co.za/db/robomongo.json
https://brightside.mtn.co.za/README.txt
https://brightside.mtn.co.za/RELEASE_NOTES.txt
https://brightside.mtn.co.za/.remote-sync.json
https://brightside.mtn.co.za/Resources.zip.manifest
https://brightside.mtn.co.za/.rspec
https://br.infinite.sx/db/dump.sql
https://br.infinite.sx/graphiql

Доменное имя brightside.mtn.co.za и другие домены повторены более 10 раз, теперь я хочу отбросить brightside.mtn .co.za и другие домены, которые повторяются более 10 раз, а затем выводят результаты, результат должен выглядеть следующим образом.

https://br.infinite.sx/db/dump.sql
https://br.infinite.sx/graphiql
https://bridgetonema.wordpress.org/manifest.json
https://bridgetonema.wordpress.org/manifest.yml

Ответы [ 2 ]

1 голос
/ 03 марта 2020

[Ниже приведен ответ на исходный вопрос, который предполагался при вводе JSON.]

Поскольку вам необходимо сосчитать элементы в группе, может показаться, что вы найдете group_by( sub("/[^/]*$";"") ) полезно.

Например, если вы хотите полностью исключить большие группы, как может показаться из одной интерпретации заявленных требований, вы можете использовать следующий фильтр:

[.results[] | select(.status==301) | .url]
| group_by( sub("/[^/]*$";"") )
| map(select(length < 10) )
| .[][]
0 голосов
/ 03 марта 2020

Если текстовый ввод находится в файле input.txt, то одним из решений с использованием jq в командной строке bash будет:

< input.txt jq -Rr '[inputs] 
  | group_by( sub("/[^/]*$";"") )
  | map(select(length < 10) )
  | .[][]'

(Если вы хотите выводить как строки JSON, опустите опция -r.)

Более эффективное решение

Приведенное выше решение использует встроенный фильтр group_by/1 и поэтому несколько неэффективно. Для очень большого числа строк ввода более эффективным решением будет:

< input.txt jq -Rr '
  def GROUPS_BY(stream; f):
    reduce stream as $x ({}; .[$x|f] += [$x] ) | .[] ;

  GROUPS_BY(inputs;  sub("/[^/]*$";""))
  | select(length < 10) 
  | .[]'

...