여기에 bash "one-liner"가 있습니다. 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
grep '[0-9]*'
E4wla28wqm3681rX
4
28
3681
grep -o '[0-9]+'
와 같은 것 grep -o '[0-9]{1}'
또는 아무것도 제공되지 않습니다 grep -o '[0-9]{1, }'
.
누구든지 이 문제를 해결하도록 도와주실 수 있나요? 아니면 적어도 위에서 언급한 "greps"에 어떤 문제가 있는지 말해 줄 수 있습니까?
문법 오류에 대해 사과드립니다.
답변1
익숙한 정규식이 제대로 작동하려면 "-E" 플래그를 사용하여 "확장 정규식"을 활성화해야 합니다. 이렇게 하면 정규 표현식이 작동합니다.
... | grep -E -o '[0-9]{4,16}'
이 경우에는 일부 배포판에서 지원하는 플래그 -P
(Perl 호환 정규식) 가 필요하지 않습니다.
답변2
해당 단일 행을 확장하고 약간 재정렬하고 몇 가지 조정을 하면 다음과 같은 결과를 얻을 수 있습니다.
cat /dev/urandom | \
tr -dc 'a-zA-Z0-9' | \
fold -w 16 | \
tr -d '[A-z]' | \
grep '....' | \
head -n 16
산출:
7405935
60722
11225
96954
3966
8774
539418
1964
59150
5994
1086
7470
2751
8534
21501
14927
참고: 개별적으로 살펴보면 n자리 숫자는 무작위일 수 있지만 숫자 길이 분포는 다음과 같습니다.아니요. 다음은 모든 숫자가 "x"로 변경되고 정렬된 후 계산된 1,000,000개의 실행입니다.
cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 16 | \
tr -d '[A-z]' | 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자리는 하나도 없습니다.