나는 그것을 시도했다 :
grep FallenHope DATABASE1.txt DATABASE2.sql >> breached.txt
2개의 데이터베이스에서 FallenHope 사용자 이름을 조회하고 싶지만 형식이 동일하지 않으며 다른 사용자 이름의 경우 원래 사용자 이름에서 파생된 여러 사용자 이름이 제공됩니다.
데이터베이스 형식은 다음과 같습니다.
1 USERNAME [email protected] hashedpass
그리고
USERNAME:[email protected]:ip:ip:hashedpass
나도 해보았어
grep -w FallenHope DATABASE1.txt DATABASE2.sql >> breached.txt
하지만 여전히 작동하지 않습니다
그것을 할 수 있는 방법이 있나요?
답변1
이것은 다음 man 1 grep
과 같이 말합니다 grep -w
.
-w
,--word-regexp
전체 단어를 구성하는 일치 항목을 포함하는 줄만 선택하십시오. 테스트에서는 일치하는 하위 문자열이 줄의 시작 부분에 있거나 단어가 아닌 구성 문자가 앞에 있어야 한다는 것입니다. 마찬가지로, 줄 끝에 있거나 단어가 아닌 구성 문자가 뒤에 와야 합니다. 단어 구성 문자는 문자, 숫자, 밑줄입니다. […]
grep FallenHope
또는 다음을 기반으로 한 접근 방식에는 적어도 두 가지 문제가 있습니다 grep -w FallenHope
.
- 일치가 필드에 반대된다는 보장은 없습니다
USERNAME
. 예를 들어FallenHope@…
이메일 주소는 일치합니다( 단어 구성 문자가 아니기-w
때문에 도움이 되지 않습니다 ).@
FallenHope-12345
일치합니다( 단어 구성 문자가 아니기-w
때문에 도움이 되지 않습니다 ).-
당신은재단사grep
각 형식에 맞는 패턴갈라져. 이것은 두 번째 것보다 더 쉬운 것 같습니다.
USERNAME:[email protected]:ip:ip:hashedpass
다음은 줄의 맨 처음부터 grep
검색합니다 . 패턴이 FallenHope
뒤따르면 일치 하거나 불가능해집니다.:
FallenHope-1
FallenHopes
grep '^FallenHope:' DATABASE2.sql
>> breached.txt
내 코드가 원하는 대로 작동하는지 확인한 후 리디렉션( )을 추가하세요 .
그리고 첫 번째 형식의 경우
1 USERNAME [email protected] hashedpass
다음과 같이 작동해야 합니다.
grep '^[[:digit:]]*[[:blank:]]*FallenHope[[:blank:]]' DATABASE1.txt
줄 시작 부분에서 0개 이상의 숫자를 검색하고, 0개 이상의 공백, FallenHope
, 공백이 차례로 검색됩니다. "0개 이상"보다 "1개 이상"을 선호할 수 있지만 형식이 엄격하다면 "0개 이상"도 괜찮습니다.
어쨌든 패턴을 형식에 맞게 조정해야 합니다. 내가 예상하지 못한 특이한 점이 있고 이를 알고 있다면 그에 따라 패턴을 조정하세요.
awk
이것도 할 수 있을 것 같아요 . 이 도구는 다음과 함께 작동하도록 설계되었습니다.필드, 이 접근 방식은 해당 작업에 완벽해 보입니다. 예제 코드:
awk '$2=="FallenHope"' DATABASE1.txt
awk -F : '$1=="FallenHope"' DATABASE2.sql