在 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.