【问题标题】:Bourne shell script, finding highest value in column 1 for specific value in column 3Bourne shell 脚本,在第 1 列中为第 3 列中的特定值查找最高值
【发布时间】:2017-01-19 01:17:00
【问题描述】:

正如标题所说,我想为第 3 列中的每个特定值在第 1 列中找到最大值。然后我想为具有 ip-address 的行打印第 2 列,第 3 列与错误代码。

我的代码:

cat $NAME |awk '{print $1, $9}' | sort -k 1 -k 2 | uniq -c | sort -k 3

Part of output

忘了提到我们正在打开一个日志文件,我们将其放入变量“NAME”中,并且在日志文件中有超过 9 列。9 表示服务器响应代码。这是日志文件中一行的示例:

127.0.0.1 - stefan [01/Apr/2002:12:17:10 +0200] "GET / HTTP/1.1" 200 301 "" "Mozilla/5.0(兼容;Konqueror/2.2.2-2;Linux )"

【问题讨论】:

  • 您从哪里获得九个 (9) 值(例如 $9)来自 indexIP 地址服务器响应代码如果您的字段分隔符是默认值? (如果您的输出反映您的输入,则最多可提供3
  • 忘了提到我们正在打开一个日志文件,我们将其放入变量“NAME”中,并且在日志文件中有超过 9 列。9 表示服务器响应代码。

标签: awk sh


【解决方案1】:

忽略你的代码sn-p,这似乎与你对问题的描述完全无关(我不明白$9的存在),我想你想要:

sort -s -k3,3 -k1,1r $NAME | awk '$3 != l{print $2, $3; l=$3}'

第 3 列中的所有特定值都出现在连续的组中。然后,辅助键 (-k1,1r) 对每个组进行排序,第 1 列中的最高值首先出现。然后 awk 只打印每组的第一行,每次在第 3 列中出现新值时打印第 2 列和第 3 列。

【讨论】:

  • 我输入的代码是图片上的输出,我忘了说我有一个我们首先打开的日志文件。 $9 是指日志文件中的服务器响应代码。
  • 您的预处理没有意义,因为它只生成 2 列。那么你怎么能对第 3 栏有疑问呢?
  • 我将您的代码添加到我的代码中,它工作正常,我唯一更改的是从 sort -s 到 sort -g。感谢您的帮助!
猜你喜欢
  • 2015-11-24
  • 1970-01-01
  • 2015-11-04
  • 2022-01-20
  • 1970-01-01
  • 2019-09-12
  • 1970-01-01
  • 2018-11-02
  • 1970-01-01
相关资源
最近更新 更多