Che*_*ppy 4 awk text-processing
我想用来awk
将输入文件的内容排序到不同的输出文件中。
假设以下输入文件:
$cat sample.txt
START
Unix
Linux
START
Solaris
Aix
SCO
Run Code Online (Sandbox Code Playgroud)
该awk
程序
awk '/START/{x="F"++i;}{print > x}' sample.txt
Run Code Online (Sandbox Code Playgroud)
将以下输出生成到文件中:
$ cat F1
awk '/START/{x="F"++i;}{print > x}' sample.txt
Run Code Online (Sandbox Code Playgroud)
$ cat F2
START
Unix
Linux
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)
你的情况有两个问题。
第一个问题是您的匹配模式包含正则表达式特有的字符,在本例中为( ... )
. 您需要对它们进行转义,以便您的程序真正找到匹配项。目前,您的程序找不到匹配项,因此x
从未初始化。这就是“重定向具有空字符串值”错误的原因。
此外,即使正则表达式的表述正确,对于在字符串第一次出现之前出现的任何内容,它也会失败Certificate Revocation List (CRL):
。所以你需要
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)
反而。