我正在嘗試使用以下正則運算式提取兩個字串之間的文本。
(?s)Non-terminated Pods:.*?in total.\R(.*)(?=Allocated resources)
perl此正則運算式在 regex101 中看起來不錯,但在與or一起使用時不知何故不列印 pod 詳細資訊grep -P。下面的命令導致空輸出。
kubectl describe node |perl -le '/(?s)Non-terminated Pods:.*?in total.\R(.*)(?=Allocated resources)/m; printf "$1"'
這是示例輸入:
PodCIDRs: 10.233.65.0/24
Non-terminated Pods: (7 in total)
Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits Age
--------- ---- ------------ ---------- --------------- ------------- ---
default foo 0 (0%) 0 (0%) 0 (0%) 0 (0%) 105s
kube-system nginx-proxy-kube-worker-1 25m (1%) 0 (0%) 32M (1%) 0 (0%) 9m8s
kube-system nodelocaldns-xbjp8 100m (5%) 0 (0%) 70Mi (4%) 170Mi (10%) 7m4s
Allocated resources:
問題:
- 如何從上述輸出中提取資訊,如下所示。正則運算式或我正在使用的命令有什么問題?
Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits Age
--------- ---- ------------ ---------- --------------- ------------- ---
default foo 0 (0%) 0 (0%) 0 (0%) 0 (0%) 105s
kube-system nginx-proxy-kube-worker-1 25m (1%) 0 (0%) 32M (1%) 0 (0%) 9m8s
kube-system nodelocaldns-xbjp8 100m (5%) 0 (0%) 70Mi (4%)
問題-2:如果我有兩個相似的輸入塊怎么辦。如何提取 pod 詳細資訊?例如:
如果輸入是:
PodCIDRs: 10.233.65.0/24
Non-terminated Pods: (7 in total)
Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits Age
--------- ---- ------------ ---------- --------------- ------------- ---
default foo 0 (0%) 0 (0%) 0 (0%) 0 (0%) 105s
kube-system nginx-proxy-kube-worker-1 25m (1%) 0 (0%) 32M (1%) 0 (0%) 9m8s
kube-system nodelocaldns-xbjp8 100m (5%) 0 (0%) 70Mi (4%) 170Mi (10%) 7m4s
Allocated resources:
....some
.......random data...
PodCIDRs: 10.233.65.0/24
Non-terminated Pods: (7 in total)
Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits Age
--------- ---- ------------ ---------- --------------- ------------- ---
default foo-1 0 (0%) 0 (0%) 0 (0%) 0 (0%) 105s
kube-system nginx-proxy-kube-worker-2 25m (1%) 0 (0%) 32M (1%) 0 (0%) 9m8s
kube-system nodelocaldns-xbjp3-2 100m (5%) 0 (0%) 70Mi (4%) 170Mi (10%) 7m4s
Allocated resources:
uj5u.com熱心網友回復:
有一些明顯的假設,并使其接近問題中的模式:
perl -0777 -wnE'
@pods = /Non-terminated\s Pods:\s \([0-9] \s in\s total\)\n(.*?)\nAllocated resources:/gs;
say for @pods
' input-file
(請注意此行中正則運算式的修飾符,它太寬而無法顯示在螢屏上/gs:)
/s問題中的正則運算式在單個文本塊上使用而不是此答案中的正則運算式(并且沒有修飾符,因為它應該)時有效。要使用多個塊(.*),需要將其中的 in 更改為(.*?),這樣它就不會一直匹配到最后一個Allocated...
這個問題并沒有說明正則運算式“與perl”一起使用的精確程度。我不能說什么失敗了。
對上面命令列程式的評論:
該
-0777開關使其將整個檔案讀入一個字串,該字串在程式中的變數$_中可用,正則運算式默認系結到該變數從 5.36.0 開始,還有一個 switch
-g的別名。-0777我們仍然需要
-n開關,以便程式遍歷輸入(STDIN或檔案)的“行”。在這種情況下,輸入記錄分隔符是未定義的,所以它只是一個“行”正則運算式捕獲被回傳,因為匹配運算子在串列背景關系中,被分配給陣列
@pods
uj5u.com熱心網友回復:
使用gnu-grep您可以使用您的正則運算式進行一些調整:
kubectl describe node |
grep -zoP '(?s)Non-terminated Pods:.*?in total.\R\K(.*?)(?=Allocated resources)'
Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits Age
--------- ---- ------------ ---------- --------------- ------------- ---
default foo 0 (0%) 0 (0%) 0 (0%) 0 (0%) 105s
kube-system nginx-proxy-kube-worker-1 25m (1%) 0 (0%) 32M (1%) 0 (0%) 9m8s
kube-system nodelocaldns-xbjp8 100m (5%) 0 (0%) 70Mi (4%) 170Mi (10%) 7m4s
- 在從輸出中洗掉該行之后使用
\K(匹配重置)\R - 用于
-z將輸入和輸出資料視為行序列的選項,每行都以零位元組(ASCII NUL 字符)而不是換行符結尾。
PS:相同的正則運算式也適用于第二個輸入塊以及每個塊之前顯示的標題行。
或者sed,您也可以為此作業使用任何版本:
kubectl describe node |
sed -n '/Non-terminated Pods:.*in total.*/,/Allocated resources:/ {//!p;}'
Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits Age
--------- ---- ------------ ---------- --------------- ------------- ---
default foo 0 (0%) 0 (0%) 0 (0%) 0 (0%) 105s
kube-system nginx-proxy-kube-worker-1 25m (1%) 0 (0%) 32M (1%) 0 (0%) 9m8s
kube-system nodelocaldns-xbjp8 100m (5%) 0 (0%) 70Mi (4%) 170Mi (10%) 7m4s
uj5u.com熱心網友回復:
使用您顯示的示例,請嘗試遵循 GNUawk代碼。用 GNU 撰寫和測驗awk。簡單的解釋是,設定RS為Non-terminated Pods:.*Allocated resources:Input_file。然后在主程式中檢查是否RT為 NOT NULL,然后使用gsub函式將變數中的 NULLawk替換為(^|\n)Non-terminated Pods:[^\n]*\nOR ,然后列印其值,該值將根據所示樣本提供輸出。\nAllocated resources:\n*RT
awk -v RS='Non-terminated Pods:.*Allocated resources:' '
RT{
gsub(/(^|\n)Non-terminated Pods:[^\n]*\n|\nAllocated resources:\n*/,"",RT)
print RT
}
' Input_file
uj5u.com熱心網友回復:
對于逐行讀取非常大的檔案,可能的解決方案如下。
選擇感興趣的行范圍并洗掉最后一個未包含在所需輸出中的行。
use strict;
use warnings;
while(<>) {
if( /^ Namespace/ .. /^Allocated resources:/ ) {
print unless /^Allocated resources:/;
}
}
exit 0;
輸出
Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits Age
--------- ---- ------------ ---------- --------------- ------------- ---
default foo 0 (0%) 0 (0%) 0 (0%) 0 (0%) 105s
kube-system nginx-proxy-kube-worker-1 25m (1%) 0 (0%) 32M (1%) 0 (0%) 9m8s
kube-system nodelocaldns-xbjp8 100m (5%) 0 (0%) 70Mi (4%) 170Mi (10%) 7m4s
Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits Age
--------- ---- ------------ ---------- --------------- ------------- ---
default foo-1 0 (0%) 0 (0%) 0 (0%) 0 (0%) 105s
kube-system nginx-proxy-kube-worker-2 25m (1%) 0 (0%) 32M (1%) 0 (0%) 9m8s
kube-system nodelocaldns-xbjp3-2 100m (5%) 0 (0%) 70Mi (4%) 170Mi (10%) 7m4s
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/494028.html
