任务说明:日志文件中存在多条记录,现要求取出文件中的某两列,而且是去重,取最新的一条记录(就是取这个ID最后出现的那一行的那两列)
脚本代码如下:
#shell声明
#!/bin/bash
#获取最后一行的行号
line_desc_num=`awk 'END{print NR}' log.txt`
#循环每一行,从第一行开始
for i in $line_desc_num
#进入循环
do
#取出这一行的第六列和第七列,用_隔开,并追加到一个新文件中
output=`cat log.txt |awk -v bl=$i -F'|' '{print $6"_"$7}'`
echo "$output" >> /tmp/cs
#结束循环
done
#创建新文件来存储最终结果
touch newfile
#查看cs文件存为变量
all_text=`cat /tmp/cs`
#循环每一行
for k in $all_text
#开始循环
do
#取出id
id=`echo $k|awk -F'_' '{print $1}'`
#判断这个id有没有在newfile中
cat /tmp/newfile|grep $id >> /dev/null
#如果在$?返回的是0
if [ $? == 0 ];then
#取出这个id的行号
line_num=`cat /tmp/newfile|grep -n "$id"|awk -F':' '{print $1}'`
#根据行号删除该行
sed -i "$line_num d" /tmp/newfile
#追加最新数据到newfile中
echo $k >> /tmp/newfile
#打印出信息告知原来的已删除
echo "pristine line is delete...."
#如果不在newfile中
else
#打印出inserting。。。
echo "inserting....."
#将这一行追加到新文件中
echo $i >> /tmp/newfile
#结束判断
fi
#结束循环
done
图如下
为了测试是取的最后一次的数据,进行手动测试
测试结果成功
图中我是写的两个脚本,其实一个脚本应该也可以的,我给整合了,但是没测试。