簡體   English   中英

使用Shell Awk搜索字符串

[英]Search String using Shell Awk

我有一個字符串:

The disk 'virtual memory' also known as 'Virtual Memory' has exceeded the maximum utilization threshold of 95 Percent.

我需要每次在此字符串詞The disk進行搜索,如果找到了,那么我只需要提取'*' also known as '*'短語並將其放在變量MONITOR

換句話說,我想搜索並將其值

MONITOR="'virtual memory' also known as Virtual Memory'"

我如何使用awk做到這一點?

這是您所描述的代碼片段。 您應該將其放在$(...)以將其分配給$ MONITOR變量:

$ awk '/The disk '\''.*'\'' also known as '\''.*'\'' has exceeded/ {gsub(/The disk /,"");gsub(/ has exceeded.*$/,"");print}' input.txt

在這種情況下,awk的兩個問題是

  • 它的正則表達式上沒有子匹配提取(這就是為什么我的解決方案在主體中使用gsub()擺脫行的第一部分和最后一部分的原因。
  • 要在shell腳本中的awk正則表達式中使用引號,您需要使用'\\''序列對其進行換碼( 此處有更多信息)

sed可能比awk容易一些:

string="The disk 'virtual memory' also known as 'Virtual Memory' has exceeded the maximum utilization threshold of 95 Percent."

MONITOR=$(echo "$string" | sed -n "/The disk \('[^']*' also known as '[^']*'\) .*/s//\1/p")

如果需要awk ,則:

MONITOR=$(echo "$string" | awk "/The disk '[^']*' also known as '[^']*'/ {
                                print \$3, \$4, \$5, \$6, \$7, \$8, \$9; } {}')

空括號{}與任何行匹配,不打印任何內容,因此awk僅處理與正則表達式匹配的行。 請注意,這假設每個磁盤都有一個帶有兩個單詞的名稱。 您需要使用功能更強大的處理程序(例如gsub函數)來進行基於正則表達式的替換。 這不是awk的優勢。 sed更容易用於該任務。

這兩個命令均設置為處理散布在不匹配行之間的多行數據(但也可以在包含匹配信息的單行上工作)。 僅用引號將引號之間的名稱打印在單獨的行上也不會很困難,這樣以后您就可以進行更少的解剖(以得到兩個以空格分隔的名稱)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM