使用sed

时间:2017-02-22 08:00:10

标签: sed

我有一个像这样的日志文件

6bTxPVZ2aOXEQ5C jamesbond.2015@business.my.emaildomain.com [01/Dec/2015:00:00:00 +0200]  
3bTxPVZ2dfXEQ5C kellytan.2016@business.my.emaildomain.com [01/Dec/2015:00:00:02 +0200] 
9bTxPVZ2dfXEQ6C jamesbond.2016@business.my.emaildomain.com [01/Dec/2015:00:00:05 +0200] 

如果第二个字段的电子邮件字段与具有相同电子邮件的早期行重复,我如何使用sed删除重复的行。

另外

如果重复项在彼此的3分钟内(使用第3个日期/时间戳字段),则只需要这样做。

在上面的示例中,第三行将被删除,除非它在最后一行之后超过3分钟。

1 个答案:

答案 0 :(得分:0)

此脚本解决了部分查询问题。 datos.dat文件包含您的代码段,但修复电子邮件地址jamesbond.2015@business.my.emaildomain.com为jamesbond.2016@business.my.emaildomain.com。通过小修复,您应该解决您的问题:

#! /bin/sh

OIFS="$IFS"
IFS=$'\n'

month_to_number()
{
    local month=$1
    case $month in
    Jan) echo 01 ;;
    Feb) echo 02 ;;
    Mar) echo 03 ;;
    Apr) echo 04 ;;
    May) echo 05 ;;
    Jun) echo 06 ;;
    Jul) echo 07 ;;
    Ago) echo 08 ;;
    Sep) echo 09 ;;
    Oct) echo 10 ;;
    Nov) echo 11 ;;
    Dec) echo 12 ;;
    esac
}

get_utc()
{
    #BAD_DATE="01/Dec/2015:00:00:05"
    local INPUT=$1

    DAY=$(echo $INPUT | cut -f 1 -d "/")
    TXT_MONTH=$(echo $INPUT | cut -f 2 -d "/")
    MONTH=$(month_to_number $TXT_MONTH)
    YEAR=$(echo $INPUT | cut -f 3 -d "/" | cut -f 1 -d ":")
    HOUR=$(echo $INPUT | cut -f 2 -d ":")
    MIN=$(echo $INPUT | cut -f 3 -d ":")
    SEC=$(echo $INPUT | cut -f 4 -d ":")

    #GOOD_DATE="2015-12-01 00:00:05"
    GOOD_DATE="$YEAR-$MONTH-$DAY $HOUR:$MIN:$SEC"

    UTC=$(date -d $GOOD_DATE +%s)
    echo $UTC
}

for EMAIL in $(cat datos.dat | cut -f 2 -d " " | sort | uniq)
do
    FOUND_BAD_DATE=""
    FOUND_UTC=""
    for ROW in $(cat datos.dat | grep $EMAIL)
    do
        FIRST_COL=$(echo $ROW | cut -f 1 -d " ")
        BAD_DATE=$(echo $ROW| cut -f 3 -d " " | sed "s/\[//")
        UTC=$(get_utc $BAD_DATE)

        if [ "$FOUND_UTC" == "" ]; then
            FOUND_BAD_DATE="$BAD_DATE"
            FOUND_UTC=$UTC
            continue
        fi

        if [ $FOUND_UTC -lt $UTC ]; then
            FOUND_BAD_DATE="$BAD_DATE"
            FOUND_UTC=$UTC
        fi

    done
    echo "$FIRST_COL $EMAIL [$FOUND_BAD_DATE]"
done

IFS="$OIFS"