簡體   English   中英

根據特定字符串過濾行,然后僅打印一些更大的屬性

[英]Filter lines based on certain string and then print only some attributes greater

我有一個包含數百萬條日志行的大文本文件。

我想過濾所有滿足以下條件的行

  1. url 應該是url=/v2/testB
  2. totalTime 值應大於 500
INFO|id=1|totaltime=5000|httpmethod=POST|url=/v1/testA
INFO|id=2|totaltime=200|httpmethod=POST|url=/v2/testB
INFO|id=3|totaltime=1000|httpmethod=POST|url=/v2/testB
INFO|id=4|totaltime=501|httpmethod=POST|url=/v2/testB

結果:-

id=3,totaltime=1000
id=4,totaltime=501

我試過用多個 awk 然后放 if 塊,不知道能不能快點完成? 謝謝 !

while IFS= read -r line; do
value=`echo $line|grep "url=/v2/testB" | awk -F"totaltime=" '{ print $2}'| awk -F"|" '{ print $1}'`
if (( $value > 500 )); then
    echo $line
fi
done < file.log

您可以使用此 awk:

awk -F '|' -v OFS=, '$NF == "url=/v2/testB" {v=$3; sub(/^totaltime=/, "", v); if (v+0 > 500) print $2, $3}' file

id=3,totaltime=1000
id=4,totaltime=501

為了使其更具可讀性:

awk -F '|' -v OFS=, '
$NF == "url=/v2/testB" {
   v = $3
   sub(/^totaltime=/, "", v)
   if (v+0 > 500)
      print $2, $3
}' file

如果你有gnu-awk那么它可以簡化為:

awk -F '|' -v OFS=, '$NF == "url=/v2/testB" &&
gensub(/^totaltime=/, "", "1", $3)+0 > 500 {print $2, $3}' file

v+0是 awk 中的簡寫,用於將字符串值轉換為數字。

$ awk -F'|' -v OFS=',' '{split($3,t,/=/)} $5=="url=/v2/testB" && t[2]>500{print $2, $3}' file
id=3,totaltime=1000
id=4,totaltime=501

對於您展示的樣品,請嘗試遵循awk程序。

awk -F'\\||totaltime=' '$NF=="url=/v2/testB" && $4>500{print $2",totaltime="$4}' Input_file

說明:以下是上述代碼的詳細說明。

  • awk程序中使用-F選項設置字段分隔符。
  • 將字段分隔符設置為| totaltime=用於 Input_file 的所有行。
  • 在主程序中,檢查條件: a- 如果$NF (最后一個字段)等於url=/v2/testB並且 b- 第 4 個字段大於 500,則執行以下操作:
  • 根據 OP 要求的 output 打印當前行的第二個字段,后跟字符串,totaltime=后跟第四個字段。

你似乎很幸運:

awk -F'|' 'BEGIN{FS="|"; OFS=","}
           { url = substr($NF,index($NF,"=")+1)
             totaltime = substr($3,index($3,"=")+1)
           }
           (url == "/v1/testB") && (totaltime+0 > 500) { print $2,$3 }
          ' file

所有 awk 解決方案都很棒,如果這是一個解決方案,請使用它們。

如果您想修復您的 Bash 工作,您可以執行以下操作:

while IFS='|' read -r id ti; do
    [[ "${ti#*=}" -gt 500 ]] && printf "%s,%s\n" "$id" "$ti"
done < <(grep 'url=/v2/testB$' file | cut -d '|' -f 2,3)

或者,您可以消除cut並保留所有五個字段:

while IFS='|' read -r c1 c2 c3 c4 c5; do
    [[ "${c3#*=}" -gt 500 ]] && printf "%s,%s\n" "$c2" "$c5"
done < <(grep 'url=/v2/testB$' file)

要么打印:

id=3,totaltime=1000
id=4,totaltime=501

暫無
暫無

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

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