觉得文章写得好,请不吝点赞、收藏
合并处理多个指令
在Linux中,可以使用grep命令配合管道和wc命令来统计多个不同的模式(pattern)。以下是一个示例,假设你想统计文件file.txt中包含"pattern1"和"pattern2"的次数:
grep -c 'pattern1' file.txt && grep -c 'pattern2' file.txt
这个命令会输出"pattern1"和"pattern2"各自出现的次数。
如果你想一行命令中统计多个模式并列出每个模式出现的次数,可以使用如下命令:
(grep -c 'pattern1' file.txt; grep -c 'pattern2' file.txt) | paste -s -d, -
这个命令会输出一行,包含"pattern1"和"pattern2"各自出现的次数,并用逗号分隔。
如果文件很大,你可能想要使用grep的-P选项来使用Perl正则表达式,这样可以在一个命令中匹配多个模式:
grep -P '(?=pattern1)(?=pattern2)' file.txt | wc -l
这个命令使用了正则表达式的前瞻断言(lookahead assertions)来匹配"pattern1"和"pattern2",然后统计匹配的次数。注意,由于前瞻断言不消耗字符,所以这种方法会导致统计结果比实际多。因此,这种方法适用于简单模式匹配,但不适合复杂情况。
统计日志中接口耗时情况
# 统计xxx.log日志中 method cost = 输出的从1ms-1000ms耗时情况
grep -E "method cost = ([0-9]+)" xxxx.log | awk '
{
match($0, /method cost = ([0-9]+)/, arr)
count[arr[1]]++
}
END {
for (i = 1; i <= 1000; i++) {
if (count[i] > 0) {
print "method cost = " i ": " count[i]
}
}
}
'
让我们详细分析一下这段 awk
命令的执行过程:
-
match($0, /method cost = ([0-9]+)/, arr):
match
函数用于在当前行$0
中查找与正则表达式/method cost = ([0-9]+)/
匹配的部分。- 正则表达式
/method cost = ([0-9]+)/
匹配形如method cost = 数字
的字符串,其中([0-9]+)
匹配一个或多个数字。 - 如果匹配成功,匹配的结果将存储在数组
arr
中,其中arr[0]
包含整个匹配的字符串,arr[1]
将包含匹配的数字部分。
-
count[arr[1]]++:
count
是一个关联数组,用于统计每个method cost
值出现的次数。arr[1]
包含了从match
函数中提取的数字部分。count[arr[1]]++
表示将arr[1]
对应的计数值加1。
执行过程示例
假设日志文件中的一行是:
method cost = 25
-
match($0, /method cost = ([0-9]+)/, arr)
:$0
是当前行,即method cost = 25
。- 正则表达式
/method cost = ([0-9]+)/
匹配method cost = 25
,并将25
存储在arr[1]
中。
-
count[arr[1]]++
:arr[1]
是25
。count[25]++
表示将count
数组中键为25
的值加1。
接上一趴,统计平均耗时
grep -E "method cost = ([0-9]+)" xxxx.log | awk '
{
match($0, /method cost = ([0-9]+)/, arr)
if (arr[1] >= 1 && arr[1] <= 1000) {
count[arr[1]]++
total_time += arr[1]
total_count++
}
}
END {
#打印耗时详情
#for (i = 1; i <= 1000; i++) {
# if (count[i] > 0) {
# print "method cost = " i ": " count[i]
# }
# }
if (total_count > 0) {
average_time = total_time / total_count
print "Average Time: " average_time
} else {
print "No data in the range 1 to 1000"
}
}
'
接上一趴,统计平均耗时和TP99
# 要统计 TP99(99th Percentile Time),我们需要对数据进行排序并找到第99百分位的值,其他分位值同理
grep -E "getFeature cost = ([0-9]+)" search-rerank-server.log.2024-08-12-22 | awk '
{
match($0, /getFeature cost = ([0-9]+)/, arr)
if (arr[1] >= 1 && arr[1] <= 1000) {
count[arr[1]]++
total_time += arr[1]
total_count++
values[total_count] = arr[1]
}
}
END {
if (total_count > 0) {
# 计算平均耗时
average_time = total_time / total_count
print "Average Time: " average_time
# 计算TP99
asort(values)
tp99_index = int(total_count * 0.99)
tp99_time = values[tp99_index]
print "TP99 Time: " tp99_time
} else {
print "No data in the range 1 to 1000"
}
}
'