我有一个日志文件(file.log
),在文件中出现多次ID,即82244956
。
已使用以下命令创建file.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重复)。我们需要基于UNIQUE 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
。
请告知我该如何修改它?
答案 0 :(得分:3)
$1
是第一个字段,即日期。 id
是$NF
用语中的最后一个字段awk
。所以:
awk '{arr[$NF] = $0} END { for (key in arr) { print arr[key] } }' file.log >> final-report.log
这将使用给定键保留最后一条记录。要保留第一条记录,您必须在脚本的主要处理部分中进行条件分配。
答案 1 :(得分:1)
awk '!_[$NF]++' file.log >> final-report.log
答案 2 :(得分:0)
您可以通过运行以下脚本来获得结果。要保留第一条记录,您应该在脚本的主要处理部分中进行条件判断。
awk -F"\t" '{delete arr;split($0,arr,"id:"); id_num=arr[2];
if(!(id_num in dic)){line[id_num]=$0;dic[id_num];}}
END{for(i in line)print line[i] }' file.log > result.log