次のようなエントリがあります
[NGS|00219|17-10-2012 19:05:43:977|INFO]
grep
私のログファイルで、または他のLinuxシェルツールを使用して、このログファイルで一意の時間値(ミリ秒を除く)を見つける方法
一意の時間を出力する 1 つの方法を次に示します。
awk '!a[substr($2,0,8)]++ { print substr($2,0,8) }' file.txt
もちろん、さまざまな方法がcut
ありsed
ますuniq
。
cut -d' ' -f2 logfile | sed -e 's/:[^:]*$//' | uniq
(スペースの後のものだけを取り、最後のコロンから最後まですべてを削除してから、重複を排除します。)
または、単に使用してsed
and uniq
:
sed -e 's/.*\ \(.*\):[^:]*$/\1/' logfile | uniq
このスクリプトは、すべての一意のタイムスタンプを提供します (時刻のみ。日付は除外します。重複するタイムスタンプはすべて無視されます)。
#!/bin/bash
awk -F'[: ]' '{print $2 ":" $3 ":" $4}' | sort | uniq -u
sort の使用はオプションです (ログは時系列であると想定しているため)
これらのタイムスタンプが含まれる行全体が必要な場合は、お知らせください。
これは 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() を使用して日付部分を削除することによって行われます。
egrepコマンドと同様に、grepは次のように使用できます。
grep -o -E'[[:digit:]] + [:] [[:digit:]] + [:] [[:digit:]] +'NGS.log | uniq
たぶん最もエレガントではない:
awk '{print $2}' log.txt | cut -c 1-8 | uniq
自分で良い答えを見つけた
egrep -o '[[:digit:]]+[:][[:digit:]]+[:][[:digit:]]+' NGS.log | uniq