Intereting Posts
Можно ли изменить устройство, отображаемое в измерителе скорости передачи в pv? Корневой каталог по умолчанию rsnapshot кажется неправильным В чем разница между использованием netcat (nc) и curl для HTTP-запросов? инструмент или технику, чтобы получить разницу двух разных установок linux Игрок Miro не распознает субтитры из видео, закодированного ffmpeg Почему порядок параметров влияет на файлы, найденные `find`? сравнить несколько файлов (более двух) с двумя разными столбцами Как запустить скрипт, когда SSSD создает домашний каталог для нового пользователя Превышение объема памяти на сервере с помощью PHP Получить контактную информацию системного администратора с терминала Проблема при загрузке с DVD-диска ubuntustudio Доступ к вторичным переменным Замените обратную косую черту sed Монитор сетевого трафика «неттоп» отходит от ожидаемых результатов Как создать фильтр Procmail, который проверяет оба заголовка и тело

Как получить количество заданной (диапазона) длины из строки с 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», упомянутым выше?

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

Чтобы получить знакомые регулярные выражения, вам нужно включить «расширенные регулярные выражения» с флагом «-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 цифр.