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

代わりに。

答え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 }' 

関連情報