grep을 사용하여 대용량 파일에서 주소를 찾는 방법은 무엇입니까?

grep을 사용하여 대용량 파일에서 주소를 찾는 방법은 무엇입니까?

이메일 소유자가 어딘가로 휴가를 떠나도록 초대받는 가상의 이메일 기록을 받는 곳에서 해야 할 일이 있습니다. 하지만 로그는 크기 때문에 작업 속도를 높이려면 grep어떻게든 헤더 주소를 사용하여 이메일 주소의 소유자를 찾아야 합니다.

주소의 기본 서면 형식은 다음과 같습니다.

name firstName
streetName streetNumber
postalCode(zip) City

이제 우편번호가 일반적으로 5자리라는 것을 알았으므로 우편번호가 포함된 행을 찾을 수 있습니다. 지금까지 내가 한 일은 다음과 같습니다.

grep -C2 ^[0-9][0-9][0-9][0-9][0-9] emails

이 명령은 연속된 5자리 숫자로 시작하는 모든 줄과 그 주변의 두 줄( -C2)을 제공합니다. 이것으로 실제로 주소를 찾을 수는 있지만 주소 주위에는 여전히 불필요한 줄이 많이 나타납니다. 주소만 얻으려면 검색을 지정해야 합니다.

그래서 5자리 숫자로 시작하고 다음과 같은 문자로 끝나는 줄을 검색해 보았습니다.

grep -C2 ^´[0-9][0-9][0-9][0-9][0-9][A-Z]$´ emails

그러나 결국 아무것도 발견되지 않았습니다. 이는 5개의 문자와 1개의 문자만 포함된 행을 검색하기 때문일 수 있습니다. 하지만 grep한 행만 검색하도록 행 검색에 지시하는 방법을 모르겠습니다.시작5 자리가 있습니다그리고 마치다문자(또는 단어)를 사용하세요.

다음으로 최선의 시도는 두 단어만 포함된 줄을 검색하여 이름과 이름을 검색하는 것이었습니다. 그러나 나는 그렇게 하는 방법을 모르고 이것을 설명하는 토론을 찾을 수 없습니다.

당신이 나를 도와주길 바라요, 알았죠?

답변1

grep -B2 -E '^[0-9]{5} +[a-zA-Z]+$'try를 사용하여 주소 블록만 찾을 수 있습니다.

몇 가지 참고사항:

  • man grep옵션에 대해 알아보려면 보기
  • 정규식 구문을 자세히 설명하는 매뉴얼 페이지를 찾으려면 grep 매뉴얼 페이지의 끝을 참조하고, GNU grep 매뉴얼 페이지 자체에서 정규식에 대해 약간 설명합니다.
  • -B"게임 전 라인", 아마도 그 이상일 것입니다.-C
  • -E확장된 정규식 구문의 경우
  • 내가 제공한 정규식은 5개의 숫자( {5}이전 내용을 5번 허용), 최소한 하나의 공백( +이전 내용을 1번 이상 허용), 그리고 줄 끝까지 문자만 포함하는 모든 줄과 일치합니다.
  • grep의 매개변수가 어떻게 인용되는지 확인하세요. `매우'또는 와 다릅니다 ".

공백이 하나만 포함된 줄을 찾으려는 경우 단어 두 개만 포함된 줄을 찾아볼 수 있습니다.

grep -E '^[^ ]+ [^ ]+'

여러 줄의 항목을 일치시키려는 경우에는 할 수 있을지 잘 모르겠습니다 grep. sed다음 줄을 패턴 공간에 로드한 N다음 해당 연결과 일치시키는 방법을 시도해 볼 수 있습니다 ( man sed이 방법이 적합한지 확인하세요). (또는 perl여러 줄 패턴과 일치할 수도 있을 것 같은데 어떻게 되는지는 모르겠습니다.)

답변2

그래서 5자리 숫자로 시작하고 다음과 같은 문자로 끝나는 줄을 검색해 보았습니다.

^[0-9][0-9][0-9][0-9][0-9][A-Z]$

이 패턴은 다음을 포함하는 행과 일치합니다.오직5자리 숫자와 1개의 (대문자) 문자입니다. 그 사이에 더 많은 콘텐츠를 원하면 패턴에 포함해야 합니다. 관계에 관심이 없다면 .*무제한으로 모든 문자를 일치시키는 데 사용하세요. 소문자도 포함하거나 대소문자를 grep -i무시하는 데 사용해야 합니다.

^[0-9]\{5\}.*[A-Za-z]$

다음으로 최선의 시도는 두 단어만 포함된 줄을 검색하여 이름과 이름을 검색하는 것이었습니다. 그러나 나는 그렇게 하는 방법을 모르고 이것을 설명하는 토론을 찾을 수 없습니다.

start, word, gap, word, end 패턴을 사용하여 두 개의 간단한 단어가 포함된 행을 일치시킬 수 있습니다.

^[[:alpha:]]\+[[:space:]]\+[[:alpha:]]\+$

그러나 이름을 정규식과 일치시키려고 하면 많은 함정이 있습니다. 바라보다https://stackoverflow.com/questions/2385701/regular-expression-for-first-and-last-name.

관련 정보