패턴 일치 후 콘텐츠를 추출하기 위해 awk를 사용하는 중에 오류가 발생했습니다.

패턴 일치 후 콘텐츠를 추출하기 위해 awk를 사용하는 중에 오류가 발생했습니다.

awk입력 파일의 내용을 다른 출력 파일로 정렬하는 데 사용하고 싶습니다 .

간단한 예

다음 입력 파일을 가정합니다.

  • $cat sample.txt
    START  
    Unix  
    Linux  
    START  
    Solaris  
    Aix  
    SCO  
    

프로그램awk

awk '/START/{x="F"++i;}{print > x}' sample.txt

다음 출력을 파일로 생성합니다.

  • $ cat F1
    START  
    Unix  
    Linux  
    
  • $ cat F2
    START  
    Solaris  
    Aix  
    SCO  
    

실제 사용 시나리오

이 기술을 실제 사용 사례에 적용해 보면,

awk '/Certificate Revocation List (CRL):/{x="F"++i;}{print > x}' test_cert.pem

다음으로 시작하는 콘텐츠를 추출하지 마세요.Certificate Revocation List (CRL):

대신 다음과 같은 오류가 발생합니다.

awk: cmd. line:1: (FILENAME=test_cert.pem FNR=1) fatal: expression for `>' redirection has null string value

패턴을 따옴표로 묶어서 시도했지만 작동하지 않습니다. 패턴이 여러 단어인지 확실하지 않으며 콘텐츠를 어떻게 추출할 수 있습니까?

다음과 같습니다 test_cert.pem.


Certificate Revocation List (CRL):
        Version 2 (0x1)
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = XX, O = XXXXX, OU = 0003 374154744412350, CN = XXX
        Last Update: Aug 15 04:37:16 2021 GMT
        Next Update: Sep 23 03:47:16 2021 GMT
        CRL extensions:
            X509v3 CRL Number:
                209
            X509v3 Authority Key Identifier:
                keyid:09:DF:3B:15:GE:10:08:D5:86:8F:5B:E7:E6:36:B9:A1:A8:1A:83:18

Revoked Certificates:
    Serial Number: AAS60F19DABCDA8AGHIK3E4A59988AAFDA8E6
        Revocation Date: Jan 29 12:45:09 2021 GMT
    Serial Number: GGF0HHHABCDA8AGHIK3E4A599KKKAFDA8E6
        Revocation Date: Jul 25 4:32:24 2021 GMT
    Signature Algorithm: sha256WithRSAEncryption
         1e:cc:8e:9d:gv:ae:eb:0a:67:95:4b:8b:b6:5d:9e:bd:48:42:
         a5:25:e8:eb:b2:22:BV:42
-----BEGIN X509 CRL-----
MIIDLLKKARMCAQEwLLKKAOKONcNAQELBQYYUzvgfzELLLKKA1UEBhMCRlIxDzANBgNV
mZ7YI0YYUzvgrzYYUzvgz9Deb78UGbaedXkYYUzvgr5Hu1Zm16YYUzvgXo67IiNUI=
-----END X509 CRL-----

답변1

귀하의 상황에는 두 가지 문제가 있습니다.

첫 번째 문제는 일치 패턴에 정규식에 고유한 문자가 포함되어 있다는 것입니다 ( ... ). 이 경우 프로그램이 실제로 일치 항목을 찾으려면 해당 문자를 이스케이프해야 합니다. 현재 프로그램은 일치하는 항목을 찾을 수 없으므로 x초기화되지 않습니다. 이것이 "리디렉션에 빈 문자열 값이 있습니다." 오류가 발생하는 이유입니다.

또한 정규 표현식이 올바르게 공식화되더라도 발생하는 모든 조건에서는 실패합니다.앞으로문자열의 첫 번째 항목입니다 Certificate Revocation List (CRL):. 그래서 당신은 필요

  1. 정규식을 수정하세요
  2. x초기화하지 않으면 아무 것도 인쇄되지 않는지 확인하세요 .

프로그램을 다음으로 변경할 수 있습니다.

awk '/Certificate Revocation List \(CRL\):/{x="F"++i;}{if (x) print > x}' test_cert.pem

다시 작동합니다.

하지만이것은 또 다른 예입니다.고정된 문자열만 찾는 경우 정규식 일치를 사용하면 안 됩니다.. 이러한 유형의 문제를 처리하기 위해 프로그램을 강화하려면 다음을 사용하십시오.

awk '$0=="Certificate Revocation List (CRL):"{x="F"++i}{if (x) print >x}' test_cert.pem

대신에.

답변2

입력 파일 상단에 빈 줄이 있습니다. awk코드가 이를 읽으면 변수 x에 값이 없으므로 print >x실행 시 오류가 발생합니다.

awk이는 코드 때문입니다.예상하다x특정 값으로 설정될 수 있도록 첫 번째 줄에서 일치시킬 정규식입니다 .

F0블록 에서 x를 시작하면 이 문제를 해결할 수 있습니다 BEGIN.

awk 'BEGIN { x = "F0" } /...your RE.../ { x = "F" ++i }  { print >x }' file

이는 정규식의 첫 번째 일치 이전의 모든 행을 파일에 출력하는 효과를 갖습니다 F0.

x설정하기 전에 읽은 내용을 모두 삭제할 수도 있습니다 .

awk '/...your RE.../ { x = "F" ++i } x != "" { print >x }' file

또한 정규 표현식은 특별하기 때문에 괄호를 이스케이프 처리해야 합니다.

awk '/Certificate Revocation List \(CRL\):/ { x = "F" ++i } x != "" { print > x }' 

관련 정보