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):
。だからあなたは必要です
- 正規表現を修正してください
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 }'