LINUX.ORG.RU

Напечатать две строки из файла

 ,


0

1

Добрый день, есть файл в котором результат пинга 3 ip вот пример одного:

ping 10.152.62.5

Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 10.152.62.5, timeout is 2 seconds:

!!!!!

Success rate is 100 percent (5/5), round-trip min/avg/max = 8/8/9 ms

мне из него нужно достать

Sending 5, 100-byte ICMP Echos to 10.152.62.5, timeout is 2 seconds:

!!!!!

Сейчас это делается так:

f = open("log3.log")
l = f.readlines()
a0 = ".1,"
a1 = ".2,"
a2 = ".5,"

with io.open('log3.log') as file:
  for line in file:
    if a0 in line:
      print( line, end='')
with io.open('log3.log') as file:
  for line in file:
    if a1 in line:
      print( line, end='')
with io.open('log3.log') as file:
  for line in file:
    if a2  in line:
      print( line, end='')

 

То есть я ищу строки по таким параметрам ".1," ".2," ".5,", но "!!!!!" всегда повторяется. Как мне добавить к найденной строке еще одну идущую следом за ней ниже?

onemoretime = 0

with io.open('log3.log') as file:
  for line in file:
    flag = a0 in line
    if flag or onemoretime:
      print( line, end='')
      onemoretime = 1 if flag else 0
Goury ★★★★★
()

Товарищ, а ты в курсе, что повторяющиеся с небольшими отличиями блоки кода принято выделять в подпрограммы, в Python их называют «функциями»? А чтобы находить в тексте сложные куски (а не одно слово), принято использовать регулярные выражения? Хотя если извратиться, можно обойтись и более примитивными инструментами.

В общем, покажи пример _нескольких_ записей в лог, а не одну.

Virtuos86 ★★★★★
()
Ответ на: комментарий от Virtuos86

Вот так примерно выглядит лог:

w2960-u2#ping 10.152.62.1

Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 10.152.62.1, timeout is 2 seconds:

!!!!!

Success rate is 100 percent (5/5), round-trip min/avg/max = 1/4/9 ms

w2960-u2#ping 10.152.62.2

Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 10.152.62.2, timeout is 2 seconds:

!!!!!

Success rate is 100 percent (5/5), round-trip min/avg/max = 8/8/9 ms

w2960-u2#ping 10.152.62.5

Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 10.152.62.5, timeout is 2 seconds:

!!!!!

Success rate is 100 percent (5/5), round-trip min/avg/max = 8/8/9 ms

lexlex361
() автор топика
Ответ на: комментарий от vvviperrr

даже если он не программист - что мешает ему прочитать

Внимание: прочитайте описание разметки LORCODE

не думаю что у него руки отсохнут

reprimand ★★★★★
()
mask = 'Sending'

t = ''
with open('log3.log') as f:
    for line in f:
        b = line.find(mask)
        if b > -1:
            t = line[b:]
        else:
            if t:
                print(t+line)
                t = ''

vvn_black ★★★★★
()
Последнее исправление: vvn_black (всего исправлений: 2)
import re
match = re.compile(r'Send.*\n.*$', re.MULTILINE)
with open('log3.log') as f:
    file = f.read()
result = re.findall(match, file)

result:

['Sending 5, 100-byte ICMP Echos to 10.152.62.1, timeout is 2 seconds:\n!!!!!', 'Sending 5, 100-byte ICMP Echos to 10.152.62.2, timeout is 2 seconds:\n!!!!!', 'Sending 5, 100-byte ICMP Echos to 10.152.62.5, timeout is 2 seconds:\n!!!!!']

conformist ★★★
()

sed -n '0~3,4p' print.txt

Напечатает каждую третью и четвертую строки начиная с 0. Подобрать цифры под себя думаю сможешь.

loz ★★★★★
()
Ответ на: комментарий от loz

строки могут меняться, это не подойдет, но спасибо!

lexlex361
() автор топика
Ответ на: комментарий от vvviperrr

Ты пукнул в лужу, а я ему дал два ценных совета. От кого в треде больше пользы? Теперь он по моему наущению предоставил лог, и ему дали полноценный ответ (сам я спать вчера пошел, не дождался). Я, кстати, тоже не программист.

Virtuos86 ★★★★★
()
Последнее исправление: Virtuos86 (всего исправлений: 1)

Что-то ты нагородил. 3 раза открывать файл не надо. Нужен просто регэксп. Как-то так:

#!/usr/bin/python
import re

with open("log3.log") as f:
    data = f.read()

print("\n\n".join(re.findall(r'Sending.*\n\n!+$', data, re.MULTILINE)))

Результат выполнения:

Sending 5, 100-byte ICMP Echos to 10.152.62.1, timeout is 2 seconds:

!!!!!

Sending 5, 100-byte ICMP Echos to 10.152.62.2, timeout is 2 seconds:

!!!!!

Sending 5, 100-byte ICMP Echos to 10.152.62.5, timeout is 2 seconds:

!!!!!

Psych218 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.