2개의 파일에서 정확한 단어를 grep한 다음 결과를 파일에 씁니다.

2개의 파일에서 정확한 단어를 grep한 다음 결과를 파일에 씁니다.

나는 그것을 시도했다 :

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.

  1. 일치가 필드에 반대된다는 보장은 없습니다 USERNAME. 예를 들어 FallenHope@…이메일 주소는 일치합니다( 단어 구성 문자가 아니기 -w때문에 도움이 되지 않습니다 ).@
  2. FallenHope-12345일치합니다( 단어 구성 문자가 아니기 -w때문에 도움이 되지 않습니다 ).-

당신은재단사grep각 형식에 맞는 패턴갈라져. 이것은 두 번째 것보다 더 쉬운 것 같습니다.

USERNAME:[email protected]:ip:ip:hashedpass

다음은 줄의 맨 처음부터 grep검색합니다 . 패턴이 FallenHope뒤따르면 일치 하거나 불가능해집니다.:FallenHope-1FallenHopes

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

관련 정보