如果字串的值大於零,則 Grep 之前的行

如果字串的值大於零,則 Grep 之前的行

您好,我有一個包含以下資訊的文字檔案:

#[Tue Oct 25 00:00:02 2016] --- START OUTPUT
#CMD: XXX
END-->0<--
#[Tue Oct 25 00:00:57 2016] --- END
#RETURN: 1
#ELAPSED TIME (in seconds): 55

#[Tue Oct 25 00:05:01 2016] --- START OUTPUT
#CMD: XXX
END-->0<--
#[Tue Oct 25 00:05:33 2016] --- END
#RETURN: 0
#ELAPSED TIME (in seconds): 32

我想獲取--End該行Return和該Elapsed行如果其對應的 Return 為>0。

到目前為止,我只能 grep Return 行grep "#RETURN:" -A 1 -B 1 f.log

>但如何僅當 Return 為0時才 grep ?

期望的輸出:

#[Tue Oct 25 00:00:57 2016] --- END
#RETURN: 1
#ELAPSED TIME (in seconds): 55

答案1

awk

awk '/END$/ {prev=$0; next}; /^#RETURN/ && $2>0 {cur=$0; pr=1; next};\
                      pr {printf "%s\n%s\n%s\n", prev, cur, $0; pr=0}' file.txt
  • /END$/ {prev=$0; next}:如果該行以 結尾END,則將其儲存為變量prev,並轉到下一行;這是之前的一行RETURN

  • /^#RETURN/ && $2>0 {cur=$0; pr=1; next}:如果該行以 開頭#RETURN且第二個欄位大於 0,則將該行儲存為cur,將變數設為pr1(true),然後轉到下一行

  • pr {printf "%s\n%s\n%s\n", prev, cur, $0; pr=0}:如果pr為true,則以所需格式列印輸出,最後設定pr為0(false)

例子:

% cat file.txt                                                                                                                   
#[Tue Oct 25 00:00:02 2016] --- START OUTPUT
#CMD: XXX
END-->0<--
#[Tue Oct 25 00:00:57 2016] --- END
#RETURN: 1
#ELAPSED TIME (in seconds): 55

#[Tue Oct 25 00:05:01 2016] --- START OUTPUT
#CMD: XXX
END-->0<--
#[Tue Oct 25 00:05:33 2016] --- END
#RETURN: 0
#ELAPSED TIME (in seconds): 32

% awk '/END$/ {prev=$0; next}; /^#RETURN/ && $2>0 {cur=$0; pr=1; next}; pr {printf "%s\n%s\n%s\n", prev, cur, $0; pr=0}' file.txt
#[Tue Oct 25 00:00:57 2016] --- END
#RETURN: 1
#ELAPSED TIME (in seconds): 55

答案2

你可以試試這個;

awk -F: '/#RETURN:/ && $2 > 0 { getline; print $0}' test

例如;

user@host:/tmp$ awk -F: '/#RETURN:/ && $2 > 0 { getline; print $0}' test
#ELAPSED TIME (in seconds): 55

答案3

您應該在您的grep

 grep -C1 'RETURN: [1-9][0-9]*' input.txt

此正規表示式應該會捕獲不是單一 0(或不以 0 開頭)的任何(正)數字。

相關內容