使用 awk 在匹配模式后提取内容时出错

Che*_*ppy 4 awk text-processing

我想用来awk将输入文件的内容排序到不同的输出文件中。

简单的例子

假设以下输入文件:

awk程序

awk '/START/{x="F"++i;}{print > x}' sample.txt
Run Code Online (Sandbox Code Playgroud)

将以下输出生成到文件中:

实际使用场景

当我将此技术应用于我的实际用例时,

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

不提取内容从 Certificate Revocation List (CRL):

相反,它给出了以下错误:

START  
Solaris  
Aix  
SCO  
Run Code Online (Sandbox Code Playgroud)

我尝试将模式放在引号中,但它不起作用,不确定模式是否是多字的,我们如何提取内容。

test_cert.pem如下外观:

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

Adm*_*Bee 6

你的情况有两个问题。

第一个问题是您的匹配模式包含正则表达式特有的字符,在本例中为( ... ). 您需要对它们进行转义,以便您的程序真正找到匹配项。目前,您的程序找不到匹配项,因此x从未初始化。这就是“重定向具有空字符串值”错误的原因。

此外,即使正则表达式的表述正确,对于在字符串第一次出现之前出现的任何内容,它也会失败Certificate Revocation List (CRL):。所以你需要

  1. 更正你的正则表达式
  2. 确保除非x初始化,否则不会打印任何内容。

你可以改变你的程序

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

它会再次起作用。

但这又是一个例子,如果您只是寻找固定的 string ,则不应使用正则表达式匹配。要针对此类问题强化您的程序,请使用

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

反而。