如何从日志文件中查找字段的第一个和最后一个出现位置?

时间:2017-05-16 09:44:11

标签: bash logging file-manipulation

我有一个日志文件,其中包含各种线程的执行开始时间和结束时间。我做了一半的工作,但我需要一些帮助来完成另一半。我写了这个命令 -

cat 2017-05-15.log | grep 'Executing ETL' | tr -s ' ' | cut -f2,3,4,5,8 -d' ' | sort -k5 -n

产生以下输出:

15 May 2017 03:43:40 696
15 May 2017 03:44:35 696
15 May 2017 03:45:02 696
15 May 2017 23:30:22 9502
15 May 2017 23:49:40 9502
15 May 2017 23:50:50 9502
15 May 2017 23:51:11 9502
15 May 2017 23:52:11 9502
15 May 2017 23:52:42 9502
15 May 2017 02:18:32 12795    
15 May 2017 02:19:35 12795
15 May 2017 02:20:02 12795
15 May 2017 02:33:39 13674
15 May 2017 02:35:13 13674
15 May 2017 02:35:42 13674
15 May 2017 18:52:28 19143
15 May 2017 18:53:01 19143
15 May 2017 18:53:35 19143
15 May 2017 18:53:59 19143
15 May 2017 18:54:40 19143

此输出按进程ID排序,这是最后一列。每个进程Id的第一次出现是进程的开始时间,而最后一次出现是进程的结束时间。 我只需要显示每个进程的第一个(开始时间)和最后一个(结束时间)。像这样:

15 May 2017 03:43:40 696
15 May 2017 03:45:02 696
15 May 2017 23:30:22 9502
15 May 2017 23:52:42 9502
15 May 2017 02:18:32 12795
15 May 2017 02:20:02 12795
15 May 2017 02:33:39 13674
15 May 2017 02:35:42 13674
15 May 2017 18:52:28 19143
15 May 2017 18:54:40 19143

每个流程ID的条目数未修复。输出不必严格采用这种格式。但我需要能够清楚地看到每个过程的开始和结束时间。

2 个答案:

答案 0 :(得分:2)

如果PID从不混淆,那么这很简单。 我们只是跟踪最后一行和它上面的PID,并在看到变化时打印最后一行和当前行。 (如果last为空,则跳过打印,否则我们会得到一个空行,并记得打印END的最后一行。)

$ awk '($5 != lastpid)  { if (last) print last; print $0; }
       { lastpid = $5; last = $0  } 
       END {print last }' < times
15 May 2017 03:43:40 696
15 May 2017 03:45:02 696
15 May 2017 23:30:22 9502
15 May 2017 23:52:42 9502
15 May 2017 02:18:32 12795    
15 May 2017 02:20:02 12795
15 May 2017 02:33:39 13674
15 May 2017 02:35:42 13674
15 May 2017 18:52:28 19143
15 May 2017 18:54:40 19143

答案 1 :(得分:0)

awk中的另一个人。哈希所有的第一次和持续,最后打印。如果只有一个条目,则只有一个条目将被输出:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "com.example.afcosta.inesctec.pt.android"
        minSdkVersion 21
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.0.1'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    compile 'com.android.volley:volley:1.0.0'
    compile 'com.android.support:design:25.0.1'
    testCompile 'junit:junit:4.12'
}