在 Linux 中打印两个模式之间的行


当您需要仅从这些文件中打印几行或将您的行保留在特定模式下时,打印两个模式之间的行很有用。

虽然您可以通过 grep 命令打印行,但无法打印特定行。在这种情况下,您可以使用 sed 或 awk 等命令来打印两个模式之间的行。

因此,在本文中,我们将详细说明在 Linux 中打印两个模式之间行的各种示例。我们还将包括使用 sed 和 awk 命令在模式之间打印行的多个条件。

在 Linux 中打印两个模式之间的行

首先,我们将创建一个包含以下内容的 example.txt 文件:

:~$ cat example.txt
Information Start
Professional Details: 
Name: John Novik
Occupation: Technical Writer
Salary: 250K/Year
Company Name: Tutorialspoint 
Information End

Information Start
Personal Details: 
Address: House No. XX Street 254/76 
Age: 26 Years
Information End

如您在以上输出中看到的,此文件有两个部分,“信息开始”和“信息结束”。因此,让我们使用 sed 和 awk 命令以不同的方式打印这两个模式之间的行。

Sed 命令

sed 命令提供了一些选项,用于仅对选定的行进行更改或修改,以及选择要修改的行。根据编辑后的脚本,此命令修改来自指定文件参数的行并将其显示为输出。

条件 1:打印不包括这两个模式的行

由于 sed 命令不支持逻辑运算符,因此您无法通过连接模式和 AND 运算符来满足上述条件。但是,我们可以通过嵌套两个检查而不是 AND 运算符来做到这一点。

:~$ sed -n '/pattern 1/, /pattern 2/{ /pattern 1/! { /pattern 2/! p } }' <filename>

注意 - 如您所见,在上述所有条件中,我们都使用了“-n”和“p”选项,这意味着:

  • -n - 阻止打印模式空间。

  • p - 控制输出。

例如,让我们排除“信息开始”和“信息结束”以打印 example.txt 文件中其余的信息:

:~$ sed -n '/Information Start/, /'Information End/{ /Professional Details/! { /'Personal Details/! p } }' example.txt
Information Start
Professional Details: 
Name: John Novik
Occupation: Technical Writer
Salary: 250K/Year
Company Name: Tutorialspoint 
Information End

Information Start
Personal Details: 
Address: House No. XX Street 254/76 
Age: 26 Years
Information End

条件 2:打印仅包含一个模式的行

您可以通过对地址范围内的行进行另一次检查来删除与模式匹配的行。该命令将类似于:

:~$ sed -n '/pattern 1/, /pattern 2/{ /pattern 2/!p }' <filename>

在此条件下,我们必须只保留一个模式并删除或抑制另一个模式。我们将打印上述文件中“信息开始”模式之间的行,方法是删除“信息结束”模式。

:~$ sed -n '/Information Start/, /Information End/{ /Information Start/!p }' example.txt
Professional Details: 
Name: John Novik
Occupation: Technical Writer
Salary: 250K/Year
Company Name: Tutorialspoint 

Personal Details: 
Address: House No. XX Street 254/76 
Age: 26 Years

条件 3:打印这两个模式之间的行

在文件中包含这两个模式并在它们之间打印行很容易。因此,使用以下 sed 命令执行此操作:

:~$ sed -n '/pattern 1/, /pattern 2/p' <filename>

这里我们使用以下命令包含两个模式,“信息开始”和“个人详细信息”:

:~$ sed -n '/Information Start/, /Information End/p' example.txt
Information Start
Professional Details: 
Name: John Novik
Occupation: Technical Writer
Salary: 250K/Year
Company Name: Tutorialspoint 
Information End

Information Start
Personal Details: 
Address: House No. XX Street 254/76 
Age: 26 Years 
Information End

Awk 命令

当您的需求复杂时,awk 命令是 sed 命令的完美替代方案。此命令具有各种选项来过滤模式处理和扫描结果。您可以替换和搜索排序和文本,索引数据库,并使用 sed 命令进行验证,因为它提供了良好的数据控制。

条件 1:打印这两个模式之间的行

与 sed 命令一样,您可以使用 awk 命令打印两个模式之间的行。为此,请使用以下命令:

:~$ awk '/pattern 1/, /pattern 2/' <filename>

在这里使用 awk 命令,我们包含这两个模式(信息开始、信息结束),如下所示:

:~$ awk '/Information Start/, /Information End/' example.txt
Information Start
Professional Details: 
Name: John Novik
Occupation: Technical Writer
Salary: 250K/Year
Company Name: Tutorialspoint 
Information End

Information Start
Personal Details: 
Address: House No. XX Street 254/76 
Age: 26 Years
Information End

如果您的变量具有非零值,则此命令也将评估此变量为真。因此,您还可以声明一个变量以在不同条件下关闭或打开打印,如下所示:

:~$ awk '/pattern 1/{ f = 1 } f; /pattern 2/{ f = 0 }' <filename> 

例如,我们声明一个变量来包含这两个模式,使用以下命令:

:~$ awk '/Information Start/{ f = 1 } f; /Information End/{ f = 0 }' example.txt
Information Start
Professional Details: 
Name: John Novik
Occupation: Technical Writer
Salary: 250K/Year
Company Name: Tutorialspoint 
Information End

Information Start
Personal Details: 
Address: House No. XX Street 254/76 
Age: 26 Years 
Information End

在上述命令中,我们没有使用范围模式,而是将变量“f”声明为 awk 打印机的开关。

  • 当匹配模式 1 时,我们会将其打开并通过“f.”打印其范围。

  • 当 f 打开时,它会打印所有行,直到模式 2 被到达。

  • 在模式 2 之前,f 的值保持为 1,因为它也要打印,并且在它之后出现时,我们通过将 f 的值设置为 0 来关闭开关。

  • 因此,您可以使用“打印机开关”来解决其他场景中的问题。

条件 2:打印不包括这两个模式的行

使用以下命令从输出中删除这两个模式:

:~$ awk '/pattern 1/{ f = 1; next } /pattern 2/{ f = 0 } f' <filename>

此命令很棘手,因为当模式 1 开始时,输出必须打开,并且紧随其后执行以下操作 { f = 1; next }。在那里,我们停止处理当前行并从输入中读取下一行。因此,开关保持打开状态,但模式 1 未打印。我们通过运行以下 awk 命令排除这两个模式:

:~$ awk '/Information Start/{ f = 1; next } /Information End/{ f = 0 } f' example.txt
Information Start
Professional Details:
Name: John Novik
Occupation: Technical Writer
Salary: 250K/Year
Company Name: Tutorialspoint 
Information End

Information Start
Personal Details:
Address: House No. XX Street 254/76 
Age: 26 Years 
Information End

条件 3:打印仅包含模式 2 的行

如果 f 放在模式 1 之前,则模式 1 的行不会在输出中打印。

:~$ awk 'f; /pattern 1/{ f = 1 } /pattern 2/{ f = 0 }' <filename>

在 awk 中使用变量时,如果之前未分配或声明,其值将为 0 或空字符串。此外,变量将仅被评估为 false,因此不会触发默认打印系统。

这里,我们仅打印“信息结束”模式之间的行。为此,我们使用以下命令:

:~$  awk 'f; /Information Start/{ f = 1 } /Information End/{ f = 0 }' example.txt
Professional Details:
Name: John Novik
Occupation: Technical Writer
Salary: 250K/Year
Company Name: Tutorialspoint 
Information End

Personal Details:
Address: House No. XX Street 254/76 
Age: 26 Years 
Information End

条件 4:打印仅包含模式 1 的行

在此条件下,我们已更改命令以包含模式 1,类似于:

:~$ awk '/pattern 1/{ f = 1 } /pattern 2/{ f = 0 } f' <filename>

如您所见,我们在上述命令中更改了 f 的位置。当 F 放在末尾时,一旦模式 2 出现,开关就会关闭。然后通过检查开关打印输出,以便不打印模式 2 的行。

因此,我们仅使用以下 awk 命令打印“信息开始”模式之间的行:

:~$  awk '/Information Start/{ f = 1 } /Information End/{ f = 0 } f' example.txt
Information Start
Professional Details:
Name: John Novik
Occupation: Technical Writer
Salary: 250K/Year
Company Name: Tutorialspoint 

Information Start
Personal Details:
Address: House No. XX Street 254/76 
Age: 26 Years

条件 5:打印特定行范围之间的行

使用以下 awk 命令,您可以定义特定行的范围并仅打印这些行。

:~$  awk 'NR==X, NR==Y' <filename>

这里 X 将是打印行的起始范围,Y 将是结束范围,它将打印这两行之间的所有行。例如,我们打印 example.txt 文件中第 5 行到第 11 行。

:~$ awk 'NR==5, NR==11' example.txt
Information End
Information Start
Personal Details:
Address: House No. XX Street 254/76 
Age: 26 Years 
Information End

结论

在本文中,我们解释了如何打印模式之间的行和文本。在 Linux 中,您可以通过 sed 和 awk 命令实用程序打印模式之间的行。我们描述了打印文件中仅特定行的各种示例和条件。请记住小心使用每个命令,否则您将从选定的文件中获得不正确的信息。

更新于: 2023-05-18

2K+ 次查看

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告
© . All rights reserved.