Как получить количество заданной (диапазона) длины из строки с grep?

Здесь у меня есть bash «one-liner»: cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 16 | head -n 16 | grep '[0-9]' cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 16 | head -n 16 | grep '[0-9]' cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 16 | head -n 16 | grep '[0-9]' , которые генерируют 16 строк из 16 символов буквенно-цифровых строк.

Пример вывода:

 nZ3BED8FYGNkYMGc zu83X7pgqLX36q2B mocN9MhYoXzOwKkO Ly2lfakdJXcX3J1s I3Zezk8wkwkX7wKg UZh36waccItxARGN 7qxJSnpKRcPR6Vki fhTW3wd0ftygKxET YQzKUxhBdEQ3O2rY fy2tcApkl5KYOjYe F05WqnwMRGIevzh9 q2c86PsKGlJkjijp h6ig7eXzPhjY75h7 PX0ikEW2z8ptQsAI M5mdMSvQmvmWF5yS GCPqQklXHc8H2Kmv 

Мне нужно получить из этих строк числа указанной (диапазона) длины, например, я хотел бы получить числа из E4wla28wqm3681rX , диапазон длин от 4 до 16. Результат должен быть 3681 .

Я попытался изменить последний grep на такую ​​форму: grep -o '[0-9]{4,16}' , но он ничего не дает, даже без head -n 16 part. С grep '[0-9]*' Я получаю каждое число (не цифра!) E4wla28wqm3681rX строки в отдельных строках, например, от E4wla28wqm3681rX Я получаю:

 4 28 3681 

Такие вещи, как grep -o '[0-9]+' , grep -o '[0-9]{1}' или grep -o '[0-9]{1, }' тоже ничего не дают.

Пожалуйста, может кто-нибудь помочь мне с этой проблемой? Или, по крайней мере, вы могли бы рассказать мне, что случилось с «greps», упомянутым выше?

Извините за любые грамматические ошибки.

  • grep -Ef для захвата соответствующих ip-адресов в двух файлах, а также результат печати или эха каждой итерации, xx.xx.xx.xx found или xx.xx.xx.xx не найден
  • Проблема с небольшим сценарием bash
  • Ошибка grep: операнд оператора повторения недействителен
  • Каждый результат grep для разных файлов
  • Сопоставьте первую часть имени пути и номера в конце строки
  • Поиск класса Java в наборе JAR с помощью find, unzip, grep
  • Как grep рекурсивно в порядке последнего модифицированного времени?
  • Разбор многомерных данных в параграфах
  • 2 Solutions collect form web for “Как получить количество заданной (диапазона) длины из строки с grep?”

    Чтобы получить знакомые регулярные выражения, вам нужно включить «расширенные регулярные выражения» с флагом «-E». При этом ваше регулярное выражение должно работать:

     ... | grep -E -o '[0-9]{4,16}' 

    Флаг -P (Perl-совместимые регулярные выражения), который поддерживает некоторые дистрибутивы, в этом случае не требуется.

    Развертывание того, что один лайнер и перестановка немного, плюс несколько настроек, получает:

     cat /dev/urandom | \ tr -dc 'a-zA-Z0-9' | \ fold -w 16 | \ tr -d '[Az]' | \ grep '....' | \ head -n 16 

    Выходы:

     7405935 60722 11225 96954 3966 8774 539418 1964 59150 5994 1086 7470 2751 8534 21501 14927 

    Примечание: n-значные числа, вероятно, являются случайными, если брать их отдельно, но распределение по цифре не является. Вот пробег 1000000, все цифры изменены на «x», отсортированы, а затем подсчитаны:

      cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 16 | \ tr -d '[Az]' | grep '....' | head -n 1000000 | \ tr '[0-9]' x | sort | uniq -c | nl -v 4 

    Выходы:

      4 594210 xxxx 5 275196 xxxxx 6 96871 xxxxxx 7 26838 xxxxxxx 8 5738 xxxxxxxx 9 997 xxxxxxxxx 10 134 xxxxxxxxxx 11 14 xxxxxxxxxxx 12 2 xxxxxxxxxxxx 

    Мы можем видеть, что чем больше цифр, тем более маловероятно число. В миллионах чисел только две цифры составляют 12 цифр, а ни одна из них не составляет 13-16 цифр.

    Linux и Unix - лучшая ОС в мире.