パターンマッチング後にコンテンツを抽出するために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

あなたの状況には2つの問題があります。

最初の問題は、一致パターンに正規表現に固有の文字が含まれていることです( ... )。この場合、プログラムが実際に一致を見つけるには、その文字をエスケープする必要があります。現在のプログラムは一致するものが見つからないため、初期化されません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

代わりに。

おすすめ記事