awk

1
(base) [iprobe@node118 202311]$ cat access1-20231116.log.* | grep "tj=" | awk '{if($6~"tj=" )print $0}' | awk '{print $6" "$(NF-2)}' | awk -F "\"" '{print $1$2}' | awk 'BEGIN{sum=0 ;count=0} {sum +=$2; count++;}  END {print " sum="sum" count="count " avg="sum/count}' sum=3312.68 count=59274 avg=0.0558875

另一条命令:

  1. cat access1-20231116.log.*: 查看以 access1-20231116.log. 开头的所有文件。

  2. grep "tj=": 过滤出包含 “tj=” 的行。

  3. awk '{if($6~"tj=" )print $0}': 如果第 6 列包含 “tj=”,则输出整行数据。

  4. awk '{print $6" "$(NF-2)}': 提取第 6 列和倒数第二列,并打印在一起。

  5. awk -F "\"" '{print $1$2}': 去掉双引号。

  6. awk 'BEGIN{sum=0 ;count=0} {sum +=$2; count++;} END {print " sum="sum" count="count " avg="sum/count}': 对第二列数据进行求和、计数和平均值操作,最后输出结果。

以上命令的意义是查找符合条件的行,提取第 6 列和倒数第二列的数据,去掉双引号,对第二列数据进行统计分析,并输出结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
less test.log |grep "GET http /api/algo/allocation?"|awk '
BEGIN { FS=" "; OFS="," }
{
# 提取时间部分和延迟值
time=$1 " " $2;
delay=$7;
gsub(/[^0-9]/, "", delay);

# 格式化时间为每分钟
minute=substr(time, 1, 19);

# 统计每分钟的请求数量和总延迟
count[minute]++;
sum[minute]+=delay;
}
END {
print "Minute,Requests,Average Delay (ms)";
for (m in count) {
avg=sum[m]/count[m];
print m "," count[m] "," avg;
}
}' | column -t -s "," |sort -k1 >ttlog.2

sort

1
2
3
4
5
less stdout |grep "search" |awk -F '/' '{print $3 $4}' |awk -F '?' '{print $1}' |sort -k 1|uniq -c |sort -nk 1

sort -t ',' 指定 ','分隔
sort -r 从大到小

这是一个Linux命令行管道,用于对标准输出进行过滤、提取和排序。下面是每个命令的解释:

  1. less stdout: 将标准输出传递给less命令,以便以分页方式查看内容。
  2. grep "search": 在输入中搜索包含"search"关键字的行。
  3. awk -F '/' '{print $3 $4}': 使用"/"作为字段分隔符,提取第三个和第四个字段,并将它们打印出来。
  4. awk -F '?' '{print $1}': 使用"?"作为字段分隔符,提取第一个字段,并将其打印出来。
  5. sort -k 1: 以第一个字段为键进行排序。
  6. uniq -c: 统计相邻的重复行,并显示每个行重复出现的次数。
  7. sort -nk 1: 按照第一个字段的数值排序(以数字方式进行排序)。

请注意,这只是一个示例命令,具体的使用场景和输入数据可能需要进行调整。less stdout |grep “search” |awk -F ‘/’ ‘{print $3 $4}’ |awk -F ‘?’ ‘{print $1}’ |sort -k 1|uniq -c |sort -nk 1

sed

1
2
3
4
5
6
7
8
9
10
11
12
不加参数i就只看到结果,没写入a.txt文件

1,删除首行
sed -i '1d' a.txt

2,删除前100行

sed -i '1,100d' a.txt

3,删除尾行
sed -i '$d' a.txt

grep

1
2
cat access1-20240320.log.wapp* | grep "GET /tj_sy_access.htm?" | grep -v "list=2"  |grep -oP '(?<=proId=)[^&]+' |sed 's/%2C/,/g' | tr ',' '\n' |grep -Fwf ../AdProduct |wc -l

逐步解释每个部分的作用:

  1. cat access1-20240320.log.wapp*:这个命令使用cat命令将所有以access1-20240320.log.wapp开头的文件内容连接起来。

  2. grep "GET /tj_sy_access.htm?":这个命令使用grep命令过滤出包含GET /tj_sy_access.htm?的行,即匹配特定URL的访问记录。

  3. grep -v "list=2":这个命令使用grep命令过滤掉包含list=2的行,即排除特定参数的访问记录。

  4. grep -oP '(?<=proId=)[^&]+':这个命令使用grep命令和正则表达式,提取出proId参数的值。(?<=proId=)是一个正则表达式的lookbehind断言,用于匹配proId=前面的内容,[^&]+表示匹配一个或多个非&字符。
    这里的-o参数表示只输出匹配到的内容,-P参数表示使用Perl兼容的正则表达式。

  5. sed 's/%2C/,/g':这个命令使用sed命令将%2C替换为逗号,,因为%2C是URL编码中的逗号。

  6. tr ',' '\n':这个命令使用tr命令将逗号,替换为换行符\n,以便每个proId值占一行。

  7. grep -Fwf ../AdProduct:这个命令使用grep命令从文件../AdProduct中匹配proId值。 -F表示按照固定字符串进行匹配,-w表示匹配整个单词,-f表示从文件中读取模式。
    通俗来讲,就是从../AdProduct文件中匹配proId值,如果匹配成功,则输出该行。

  8. wc -l:这个命令使用wc命令统计匹配到的行数,即特定proId值的访问次数。

总结起来,这个命令的作用是统计日志文件中特定URL的访问次数,其中排除了特定参数的访问记录,并且只统计匹配到的proId值在../AdProduct文件中存在的次数。

reference

  1. Linux文本三剑客超详细教程—grep、sed、awk - alonghub - 博客园 (cnblogs.com)
  2. Linux命令大全(手册) – 真正好用的Linux命令在线查询网站 (linuxcool.com)