10년 된 이메일 아카이브를 내보냈는데 용량이 꽤 큽니다.
비트코인 개인 키를 검색하기 위해 64자 길이의 문자열의 모든 텍스트를 구문 분석하고 싶습니다.
특정 길이의 문자열을 구문 분석하는 방법은 무엇입니까?
답변1
0-9
16진수 형식의 256비트 숫자(범위 내 64자 - 비트코인 개인 키에 가능한 형식 중 하나) 를 검색하려는 경우 A-F
다음을 수행해야 합니다.
egrep -aro '\<[A-F0-9]{64}\>' files and dirs ...
옵션을 추가하거나 일부 키가 소문자인 경우 -i
범위도 포함합니다 .a-f
동일한 클래스에서 지정된 길이의 문자열을 찾는 일반적인 문제의 경우 옵션과 함께 GNU grep과 함께 사용할 수 있는 pcre regexps를 사용하는 것이 더 좋습니다 -P
. 예를 들어, 최소 길이가 2이고 최대 길이가 4이고 대문자 이외의 문자로 구분된 문자 집합에서 대문자를 찾으려면 다음을 수행합니다.
echo ÁRVÍZtűrő tükörFÚRÓgép |
LC_CTYPE=en_US.UTF-8 grep -Po '(?<!\p{Lu})\p{Lu}{2,4}(?!\p{Lu})'
FÚRÓ
소문자, 공백이 아닌 문자 등 \p{Lu}
으로 대체합니다 . 보다\p{Ll}
\S
여기그리고여기전체 목록을 확인하세요.
(?<!...)
그리고 (?!...)
는부정적인뒤를 돌아보고 앞을 보아라너비가 0예를 들어 (?<!<)\w(?!>)
and로 묶이지 않은 경우 "단어" 문자가 일치됩니다. 너비가 0인 어설션은 를 통해 구현할 수 있습니다.<
>
\<
vi
(?<!\w)(?=\w)
답변2
길이가 64인 모든 단어를 찾으려면 다음을 /path/to/file
사용할 수 있습니다.
tr -c '[:alnum:]' '\n' < /path/to/file | grep '^.\{64\}$'
이렇게 하면 영숫자가 아닌 모든 문자가 개행 문자로 바뀌므로 각 단어가 한 줄에 표시됩니다. 그런 다음 이 결과를 필터링하여 길이가 64인 단어만 포함합니다.
답변3
GNU(Linux의 기본값)가 있는 경우 grep
다음을 수행할 수 있습니다.
grep -Po '(^|\s)\S{64}(\s|$)' file
(단어 경계) (공백이 아닌) 및 (정확히 N 문자 찾기)를 제공하고 "줄에서 일치하는 부분만 인쇄"하는 것을 의미하는 -P
Perl 호환 정규식을 활성화합니다 . 그런 다음 non-의 확장자를 찾습니다. 공백은 정확히 64자 길이이며, 줄 시작 부분( )이나 공백( ) 뒤에 있고, 줄 끝( )에 있거나 다른 공백 문자로 끝납니다.\b
\S
{N}
-o
^
's
$
결과에는 문자열의 시작과 끝 부분에 공백 문자가 포함되므로 더 자세히 구문 분석하려면 다음을 사용할 수 있습니다.
grep -Po '(^|\s)\K\S{64}(?=\s|$)'
이것은 공백 문자 또는 문자열의 시작 부분을 찾은 (\s|^)
다음 이를 버리고 \K
공백이 아닌 64개의 문자를 찾은 다음 ( (?=foo)
"라고 함)시야"이며 일치 항목에는 공백 문자 또는 줄 끝이 포함되지 않습니다.
답변4
grep은 문자열을 "검색"하는 데 적합한 도구인 것 같습니다. 이제 남은 일은 정규식을 사용하여 이러한 문자열을 정의하는 것입니다. 첫 번째 문제는 단어의 범위를 정의하는 것입니다. a book, a lamp
단어 구분 기호 로 사용되는 "공백"만큼 간단하지는 않습니다. ,
동일한 개념에서 다른 많은 문자, 심지어 줄의 시작이나 끝도 단어 구분 기호 역할을 할 수 있습니다. GNU grep에는 몇 가지 단어 구분 기호가 있습니다:
\<
말이 시작됩니다.\>
단어 끝.\b
단어 경계.
그들은 모두 단어가 [a-zA-Z0-9_]
일련의 문자라고 가정합니다. 괜찮다면 다음 정규 표현식이 작동합니다.
grep -o '\<.\{64\}\>' file
확장 정규식을 사용할 수 있으면 다음을 \
줄일 수 있습니다.
grep -oE '\<.{64}\>' file
단어 시작( \<
), 64( {64}
)자( .
) ~ 단어 끝( \>
) 중에서 선택하고 일치하는 -o
부분( )만 인쇄합니다.
그러나 dot( .
)는 일치합니다.어느성격이 너무 많을 수도 있습니다.
보다 엄격하게(16진수) 선택하려면 다음을 사용하십시오.
grep -oE '\<[0-9a-fA-F]{64}\>' file
이렇게 하면 소문자 16진수를 사용할 수 있습니다.또는수도. 그러나 일부 비ASCII 문자가 포함될 수 있으므로 엄격하게 적용하려면 다음을 사용하세요.
LC_ALL=C grep -oE '\<[0-9a-fA-F]{64}\>' file
\<
grep -P와 같은 일부 grep 구현에는 "단어 시작" 또는 "단어 끝"( 및 과 같은)이 없지만 \>
"단어 경계"( 와 같은 \b
)는 있습니다.
grep -oP '\b[0-9a-fA-F]{64}\b' file
몇 가지 언어가 있어요POSIX 단어 경계를 허용 [[:<:]]
하지만 [[:>:]]
Perl은 허용하지 않으며 PCRE 8.34에서만 허용합니다..