![패턴 일치 후 콘텐츠를 추출하기 위해 awk를 사용하는 중에 오류가 발생했습니다.](https://linux55.com/image/193616/%ED%8C%A8%ED%84%B4%20%EC%9D%BC%EC%B9%98%20%ED%9B%84%20%EC%BD%98%ED%85%90%EC%B8%A0%EB%A5%BC%20%EC%B6%94%EC%B6%9C%ED%95%98%EA%B8%B0%20%EC%9C%84%ED%95%B4%20awk%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%20%EC%A4%91%EC%97%90%20%EC%98%A4%EB%A5%98%EA%B0%80%20%EB%B0%9C%EC%83%9D%ED%96%88%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
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):
. 그래서 당신은 필요
- 정규식을 수정하세요
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 }'