1

次のようなエントリがあります

[NGS|00219|17-10-2012 19:05:43:977|INFO]

grep私のログファイルで、または他のLinuxシェルツールを使用して、このログファイルで一意の時間値(ミリ秒を除く)を見つける方法

4

7 に答える 7

3

一意の時間を出力する 1 つの方法を次に示します。

awk '!a[substr($2,0,8)]++ { print substr($2,0,8) }' file.txt
于 2012-10-18T06:37:00.183 に答える
2

もちろん、さまざまな方法がcutありsedますuniq

 cut -d' ' -f2 logfile | sed -e 's/:[^:]*$//' | uniq

(スペースの後のものだけを取り、最後のコロンから最後まですべてを削除してから、重複を排除します。)

または、単に使用してsedand uniq:

 sed -e 's/.*\ \(.*\):[^:]*$/\1/' logfile | uniq
于 2012-10-18T06:18:27.060 に答える
2

このスクリプトは、すべての一意のタイムスタンプを提供します (時刻のみ。日付は除外します。重複するタイムスタンプはすべて無視されます)。

#!/bin/bash

awk -F'[: ]' '{print $2 ":" $3 ":" $4}' | sort | uniq -u

sort の使用はオプションです (ログは時系列であると想定しているため)

これらのタイムスタンプが含まれる行全体が必要な場合は、お知らせください。

于 2012-10-18T06:19:24.790 に答える
2

これは awk ではかなり単純です

awk -F'|' '{  
              split($3, a, / /);
              sub(/:[[:digit:]]+$/, "", a[2]); 
              arr[a[2]] = 1; 
           } END { 
              for (i in arr) 
                 print i 
           }' file.log

このsub()関数を使用してミリ秒を削除し、その値をキーとして配列に追加できます。配列キーは一意であるため、これにより重複が削除されます。処理後、END ブロックはキーを繰り返し処理し、それらを出力します。

日付を除外するように回答が更新されました。これは、タイムスタンプで split() を使用して日付部分を削除することによって行われます。

于 2012-10-18T06:20:13.697 に答える
1

egrepコマンドと同様に、grepは次のように使用できます。

grep -o -E'[[:digit:]] + [:] [[:digit:]] + [:] [[:digit:]] +'NGS.log | uniq

于 2012-10-18T08:09:53.590 に答える
1

たぶん最もエレガントではない:

awk '{print $2}' log.txt | cut -c 1-8 | uniq
于 2012-10-18T06:19:03.363 に答える
0

自分で良い答えを見つけた

egrep -o '[[:digit:]]+[:][[:digit:]]+[:][[:digit:]]+' NGS.log | uniq
于 2012-10-18T06:38:56.847 に答える