【问题标题】:How to get file information line by line with some condition and without "awk" [closed]如何在没有“awk”的情况下逐行获取文件信息[关闭]
【发布时间】:2020-12-30 20:24:59
【问题描述】:

我有一个文件

192.168.10.1 - - [12/aug/20:23:30:41] "PUT /img.jpg" 200 - 
192.168.10.2 - - [10/aug/20:01:20:30] "PUT /img.jpg " 404 - 
192.168.10.2 - - [10/aug/20:12:10:15] "PUT /img.jpg " 200 2114 
192.168.10.3 - - [09/aug/20:06:20:12] "GET / img.jpg" 200 377 
192.168.10.1 - - [07/aug/20:12:40:20] "GET /img.jpg" 200 2114
192.168.10.1 - - [01/aug/20:06:45:50] "GET /img.jpg" 404 - 

我想计算文件中的每一行,其中以 2 开头的行的倒数第二个数字,例如 192.168.10.1 在文件中存在 3 次,但 192.168.10.1 只有 2 行是 200 和 1是 404。所以我只想计算 2 行

192.168.10.1  2
192.168.10.2  1
192.168.10.3  1

【问题讨论】:

  • 当您真正自己尝试过一些东西并且对为什么它不起作用时有疑问时,我们的格式效果最好。如果您尚未尝试编写自己的代码、遇到特定问题并搜索过有关该问题的其他问题,那么在这里提出问题通常为时过早。
  • 也就是说,作为现有的已回答实例:sort uniq ip addresses in from apache log
  • 你如何定义连接尝试
  • @M.NejatAydin 在状态码的帮助下“连接尝试”(从 2 开始)。状态码是每行倒数第二个数字,例如第一行状态码是 404 第二行状态码是 200
  • 请不要对 cme​​ts 增加额外的要求。答案很好,但很明显,每次你透露新的秘密要求时,你都会一次又一次地打破它们。您必须编辑您的问题。您必须严格定义“尝试”的含义。任何请求都是对我的尝试,但你不想要这个。是否要包含响应状态代码或请求类型?您必须为样本输入提供准确的预期输出。您必须根据您的要求将代表性案例纳入输入。

标签: bash shell perl unix sh


【解决方案1】:

这可以通过多种方式完成,其中一种方式是使用 awk、sort 和 uniq 命令的组合

 awk -F ' ' '$(NF-1) ~ /^2/ {print $1}' log_file.txt | sort | uniq -c | sort 

解释:

  • awk -F ' ' '$(NF-1) ~ /^2/ {print $1}' --> 这将检查倒数第二列是否以“2”开头,如果是,它将打印第一列,即,IP 地址
  • sort --> 将对输出进行排序
  • uniq -c --> 将显示一行重复了多少次,以及 重复的次数。

【讨论】:

  • 你不需要cat filename | command,而只需要command <filename,如果是awk,它很高兴将文件名作为参数,如awk -f ' ' '{print $1}' log_file.txt | sort | uniq -c | sort | cut -f2-
  • @Homer 我只想要状态码以 2 开头的 IP(状态码是每行的倒数第二个数字)例如第一行状态码是 404 第二行状态码是 200跨度>
  • 加倍强调 LéaGris 之前所说的——cat filename | somecommand 有时比somecommand <filename 或(如果适用)somecommand filename 效率低几个数量级。具体示例包括tail(当从cat 输入时,它必须从头开始读取文件;给定一个真实的句柄,它可以直接跳到结尾); sort(当给定一个真实文件时,它可以分成线程同时读取文件的不同子集并并行排序,而来自cat的管道只能从前到后读取);和其他人。
  • LéaGris/Charles ,同意,我们可以移除猫。谢谢。 @Zeeshan,我们可以在 awk 中设置一个条件,以检查倒数第二个值是否以 2 开头,例如: awk -F ' ' '$(NF-1) ~ /^2/ {print $1}' log_file.txt |排序 |唯一的-c |排序
【解决方案2】:

使用命令行实用程序:

grep '^[^"]*"[^"]*" 2' logfile |
cut -d' ' -f1 | sort | uniq -c | sort -nr | head -n 10

这列出了按尝试次数排序的前十个 IP 地址。

【讨论】:

  • 这不起作用
  • “不工作”作为描述基本上是无用的——它没有提供任何人可以用来生成确实工作的解决方案的信息。您在部署此代码时遇到了什么具体问题
  • @Zeeshan 你得到什么输出?我已经在您的示例上进行了尝试,并且可以正常工作。
  • @M.NejatAydin 什么都没有
  • @Zeeshan 那么要么你输入了错误的文件,要么你的样本格式不正确。
猜你喜欢
  • 1970-01-01
  • 2018-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-27
  • 1970-01-01
  • 1970-01-01
  • 2012-01-16
相关资源
最近更新 更多