[英]Use AWK to print lines that have a certain string followed by a number greater than 10000
[英]Filter lines based on certain string and then print only some attributes greater
我有一個包含數百萬條日志行的大文本文件。
我想過濾所有滿足以下條件的行
url=/v2/testB
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 的所有行。$NF
(最后一個字段)等於url=/v2/testB
並且 b- 第 4 個字段大於 500,則執行以下操作:,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.