2016-08-25 2 views
0

У меня есть большой файл журнала.удалить некоторые строки в файле журнала

После удаления метки времени каждой строки, сортировать его cat logfile | sort -u > logfile, так что журналы являются чистыми и организованы как

failed to correct PL.ASBF..HHZ.2011.348 because of divided by zero 
failed to correct PL.ASBF..HHZ.2011.349 because of divided by zero 
failed to correct PL.ASBF..HHZ.2011.350 because of divided by zero 
. 
. (lines not shown here) 
. 
failed to correct PL.ASBF..HHZ.2015.364 because of divided by zero 
failed to correct PL.ASBF..HHZ.2015.365 because of divided by zero 
. 
. 
. (lines not shown here) 
. 
. 
failed to correct PL.HSPB..HHZ.2011.128 because of Illegal format 
failed to correct PL.HSPB..HHZ.2011.129 because of Illegal format 
failed to correct PL.HSPB..HHZ.2011.130 because of Illegal format 
. 
. (lines not shown here) 
. 
failed to correct PL.HSPB..HHZ.2014.364 because of Illegal format 
failed to correct PL.HSPB..HHZ.2014.365 because of Illegal format 

я могу получить регистрируемые элементы (например, PL.HSPB в приведенном выше примере) по

grep -oE " [0-9A-Z]*\.[0-9A-Z]*" logfile | sort -u 

Однако, я также хочу узнать информацию о дате и сделать ее более ясной, я хочу удалить промежуточные линии. Например,

failed to correct PL.HSPB..HHZ.2011.128 because of Illegal format 
failed to correct PL.HSPB..HHZ.2011.129 because of Illegal format 
failed to correct PL.HSPB..HHZ.2011.130 because of Illegal format 
. 
. (lines not shown here) 
. 
failed to correct PL.HSPB..HHZ.2014.364 because of Illegal format 
failed to correct PL.HSPB..HHZ.2014.365 because of Illegal format 

после удаления становится

failed to correct PL.HSPB..HHZ.2011.128 because of Illegal format 
failed to correct PL.HSPB..HHZ.2014.365 because of Illegal format 

т.е. для элемента, только первые и последние строки сохраняются (цифры в год и юлианский день).

Есть ли какая-нибудь командная оболочка, чтобы сделать это с легкостью?

+0

@ shellter. Дата в файле журнала, например '2014.365', равна 'year.jday'. Нет необходимости в компьютере julian date из месяца и дней. – Lee

+0

Доу, я пропустил, что Y.Jday был в ваших исходных данных. Удачи. – shellter

+0

Просто добавьте еще один 'grep' в ваш конвейер, который производит ваш текущий выход? 'grep"^не удалось подключиться "logfile | grep -oE "[0-9A-Z] * \. [0-9A-Z] *" | sort -u'? Удачи. – shellter

ответ

0

Сценарий:

$ cat hhz.py 
#!/usr/bin/env python 

import sys, re 
from collections import OrderedDict 

undateds = set() 
firsts = OrderedDict() 
lasts = OrderedDict() 

while True: 
    line = sys.stdin.readline() 
    if line == '': 
    break 
    line = line.rstrip("\n") 

    x = re.match("(.*HHZ\.)([0-9][0-9][0-9][0-9]\.[0-9]+)(.*)", line) 
    if x is None: 
    continue 

    before = x.group(1) 
    during = x.group(2) 
    after = x.group(3) 
    undated = re.sub("(.*HHZ\.)[0-9][0-9][0-9][0-9]\.[0-9]+ (.*)", line, before+after) 

    if not undated in firsts: 
    firsts[undated] = line 
    lasts[undated] = line 

for undated in firsts: 
    first = firsts[undated] 
    last = lasts[undated] 
    print first 
    if first != last: 
    print last 

Вход:

$ cat hhz.dat 
failed to correct PL.ASBF..HHZ.2011.348 because of divided by zero 
failed to correct PL.ASBF..HHZ.2011.349 because of divided by zero 
failed to correct PL.ASBF..HHZ.2011.350 because of divided by zero 
failed to correct PL.ASBF..HHZ.2015.364 because of divided by zero 
failed to correct PL.ASBF..HHZ.2015.365 because of divided by zero 
failed to correct PL.HSPB..HHZ.2011.128 because of Illegal format 
failed to correct PL.HSPB..HHZ.2011.129 because of Illegal format 
failed to correct PL.HSPB..HHZ.2011.130 because of Illegal format 
failed to correct PL.HSPB..HHZ.2011.130 because of Something else 
failed to correct PL.HSPB..HHZ.2014.364 because of Illegal format 
failed to correct PL.HSPB..HHZ.2014.365 because of Illegal format 

Выход:

$ hhz.py < hhz.dat 
failed to correct PL.ASBF..HHZ.2011.348 because of divided by zero 
failed to correct PL.ASBF..HHZ.2015.365 because of divided by zero 
failed to correct PL.HSPB..HHZ.2011.128 because of Illegal format 
failed to correct PL.HSPB..HHZ.2014.365 because of Illegal format 
failed to correct PL.HSPB..HHZ.2011.130 because of Something else 
  • Группа вещь regexing из даты части. undated - это уникальное имя.
  • Получите первое место в группе, выполнив приложенный ордер-dict, если он еще не установлен.
  • Получить последний в группе, выполнив приказ-dict положить безусловно.
  • Используйте OrderedDict сохранить порядок ввода-файла (используйте dict, если вы не хотите, что)
  • Проверьте first != last, чтобы избежать печати то же самое в два раза в случае, если есть только один элемент в группе