grep이 여러 항목을 찾습니다.

grep이 여러 항목을 찾습니다.

LDAP 기본 덤프 파일에서 6개 정도의 항목을 추출해야 합니다.

fullName:
uid:
email:
...

주로 uid가 파일의 여러 위치에 나타나기 때문에 검색에는 콜론이 필요하지만 uid:가 필요한 것입니다. 콜론을 피하려고 시도했지만 내가 사용한 모든 조합은 아마도 첫 번째 검색어를 찾지만 두 번째 검색어는 찾지 못할 것입니다. 그러면 목록에 추가할 항목이 서너 개 더 있습니다.

기존 출력:

gw1:~ # cat dump2.txt|awk "/email:/" && "/fullName:/"
-bash: /fullName:/: No such file or directory

gw1:~ # cat dump2.txt|grep -e "email:" -e "fullName:"
fullName: LDAP Proxy2
fullName: Student Email Administrator
fullName: Richard C. Holly
fullName: Jene E. Brown

예상 출력:

gw1:~ # cat dump2.txt|awk "/email\:/" print{','} && "/fullName\:/" print{','} && "/gid\:/"
email: [email protected] , fullName: LDAP Proxy2, gui: 987

csv 형식을 참고하세요.

답변1

샘플 입력 파일부터 시작해 보겠습니다.

$ cat dump.txt
some: other
email: [email protected]
fullName: LDAP Proxy2
gui: 987
other: thing

필요한 행을 추출하고 CSV로 형식을 다시 지정하려면 다음 안내를 따르세요.

$ awk '/email:|fullName:|gui:/{s=s", "$0} END{print substr(s,3)}' dump.txt
email: [email protected], fullName: LDAP Proxy2, gui: 987

작동 방식:

  • /email:|fullName:|gui:/{s=s", "$0}

    이것은 조건 뒤에 오는 명령문입니다. 조건은 /email:|fullName:|gui:/찾고 있는 문자열 중 하나가 포함된 행에만 적용되는 정규식입니다 . 정규식에서 이 |기호는 논리적 OR을 나타냅니다.

    조건이 true이면 명령문이 실행됩니다. 이 명령문을 사용하면 쉼표, 공백 및 현재 줄이 변수에 추가됩니다 s.

    awk파일의 모든 줄을 암시적으로 반복하고 각 줄에서 위 작업을 수행합니다.

  • END{print substr(s,3)}

    입력 파일 읽기를 마쳤으면 처음 두 문자를 제외한 모든 문자를 인쇄하려고 합니다 s. 처음 두 문자는 ","로 중복됩니다. 이 기능은 substr이를 삭제하는 데 사용됩니다.

샘플 출력

사용귀하가 제공한 문서paste.ee댓글에 지정한 필드("mail:", "fullName" 및 "uid")를 선택하면 다음과 같은 결과가 표시됩니다.

$ awk '/mail:|fullName:|uid:/{s=s", "$0} END{print substr(s,3)}' dump.txt
mail: [email protected], uid: pgroce, fullName: Patti K. Groce

모든 필드를 찾았습니다.

빈 필드를 입력하세요

의견에 따라 dump3.txt끝에 빈 항목을 두는 것을 고려하십시오.

$ cat dump3.txt
other: thing
mail: [email protected]
uid: pgroce
fullName: Patti K. Groce
mail:
mail:
Other: Thing
mail:
$ awk '/mail:|fullName:|uid:/{s=s", "$0} END{print substr(s,3)}' dump3.txt
mail: [email protected], uid: pgroce, fullName: Patti K. Groce, mail:, mail:, mail:

귀하의 요구 사항에 따라 빈 항목은 빈 항목으로 인쇄됩니다.

답변2

전체 파일을 Perl 해시로 구문 분석하고 필수 필드를 인쇄할 수 있습니다(파일 이름 뒤에 입력 인수로 제공됨).

perl -nle '
    BEGIN{
        $input_file = shift;
        $required_fields = shift
    }
    my ($field,$val) = split/:/;
    next unless defined $field; #Skip lines with no field names
    $fields{$field} = $val;
    END{
        print join ",",@fields{split/,/,$required_fields}
    }' your_file 'email,fullName,gui'

관련 정보