linux - grep 唯一出现

标签 linux unix awk

我有一个日志文件 (file.log),文件中多次出现 id,即 82244956file.log 已使用以下命令创建:

gzip -cd /opt/log.gz | grep "JBOSS1-1" >> ~/file.log

示例:

2012-04-10 09:01:18,196 LOG  (7ysdhsdjfhsdhjkwe:IN) JBOSS1-1 (RP-yedgdh5567) [PayPalWeb] Fetch data with id: 82244956  
2012-04-10 09:02:18,196 LOG  (24343sdjjkidgyuwe:IN) JBOSS1-1 (RP-yedgdh5567) [PayPalWeb] Fetch data with id: 82244956  
2012-04-10 09:03:18,196 LOG  (6744443jfhsdgyuwe:IN) JBOSS1-1 (RP-yedgdh5567) [PayPalWeb] Fetch data with id: 82244957  
2012-04-10 09:04:18,196 LOG  (7ysdhsd5677dgyuwe:IN) JBOSS1-1 (RP-yedgdh5567) [PayPalWeb] Fetch data with id: 82244957  

同样,我们有 10000 行具有不同的 ID(但每个 ID 重复 2-3 次。示例中顶部和底部 2 行分别重复 ID 82244956 和 82244957)。我们需要基于唯一 ID 的结果集(来自匹配 ID 的任何行)即:

2012-04-10 09:01:18,196 LOG  (7ysdhsdjfhsdhjkwe:IN) JBOSS1-1 (RP-yedgdh5567) [PayPalWeb] Fetch data with id: 82244956  
2012-04-10 09:03:18,196 LOG  (6744443jfhsdgyuwe:IN) JBOSS1-1 (RP-yedgdh5567) [PayPalWeb] Fetch data with id: 82244957  

我尝试在 Linux 上运行 awk 程序,但没有成功:

awk ' { arr[$1]=$0 } END { for ( key in arr ) { print arr[key] } } ' file.log >> final-report.log

或者更好的方法是创建仅具有不同 ID 的 file.log

请告知如何修改它?

最佳答案

$1 是第一个字段,日期。 id 是最后一个字段,用 awk 的说法是 $NF。所以:

awk '{arr[$NF] = $0} END { for (key in arr) { print arr[key] } }' file.log >> final-report.log

这将保留给定键的最后一条记录。要保留第一条记录,您必须在脚本的主要处理部分进行条件赋值。

关于linux - grep 唯一出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10222937/

相关文章:

linux - Makefile 中的 Chroot 语法

python - 在 python 中禁用从\r\n 到\n 的自动更改

linux - 如何在 unix shell 中转置行和列?

unix - 仅使用某些列进行排序

linux - 将数据转换为单引号

bash - 使用 AWK 过滤掉具有数值范围的列

Linux Shell 脚本 : How to compare a specific field in a text document with specific text in an if statement

c++ - 哪里应该使用ncurses刷新()?

Linux 新手 : Linux vs POSIX manual

bash - 从 XML 文件中删除特定的重复行