首页 > 解决方案 > 如何在没有“awk”的情况下逐行获取文件信息

问题描述

我有一个文件

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 开头的行的倒数第二个数字,例如,文件中存在 3 次 192.168.10.1,但 192.168.10.1 只有 2 行是 200,1 是 404。所以我只想数 2 行

192.168.10.1  2
192.168.10.2  1
192.168.10.3  1

标签: bashshellperlunixsh

解决方案


这可以通过多种方式完成,其中一种方式是使用 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 --> 将告知一行重复了多少次,以及重复的次数。

推荐阅读