在 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
如果您的变量具有非零值,则此命令也会将此变量计算为 True。因此,您还可以声明一个变量来在不同条件下关闭或打开打印,如下所示 -
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;下一个 }。我们停止处理当前行并从输入中读取下一行。因此开关保持打开状态,但不打印图案 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 命令实用程序打印模式之间的行。我们已经描述了仅打印文件中特定行的各种示例和条件。请记住小心使用每个命令,否则您将从所选文件中获得不正确的信息。