Python grep и вырезать - PullRequest
       88

Python grep и вырезать

1 голос
/ 29 мая 2020

В Linux легко получить определенную строку с помощью таких инструментов, как grep, cut или awk.

Этот образец show version взят из https://www.cisco.com/c/en/us/td/docs/switches/lan/catalyst9300/software/release/16-6/configuration_guide/sys_mgmt/b_166_sys_mgmt_9300_cg/b_166_sys_mgmt_9300_cg_chapter_01.html

wolf@linux:~$ cat shver
cisco C9300-48P (X86) processor with 818597K/6147K bytes of memory.
Processor board ID FCW2049G03S
2048K bytes of non-volatile configuration memory.
8388608K bytes of physical memory.
1638400K bytes of Crash Files at crashinfo:.
11264000K bytes of Flash at flash:.
0K bytes of WebUI ODM Files at webui:.
Model Number                       : C9300-48P

Base Ethernet MAC Address          : 04:6c:9d:01:3b:80
Motherboard Assembly Number        : 73-17956-04
Motherboard Serial Number          : FOC20465ABU
Model Revision Number              : P4B
Motherboard Revision Number        : 04
Model Number                       : C9300-48P
System Serial Number               : FCW2049G03S

wolf@linux:~$ 

grep and cut

wolf@linux:~$ grep 'Model Number' shver | cut -d : -f 2
 C9300-48P
 C9300-48P
wolf@linux:~$ 

Удалить лишний пробел (если есть лучшее решение, дайте мне знать)

wolf@linux:~$ grep 'Model Number' shver | cut -d : -f 2 | cut -d ' ' -f 2
C9300-48P
C9300-48P
wolf@linux:~$ 

Выберите 1-й вывод

wolf@linux:~$ grep 'Model Number' shver | cut -d : -f 2 | cut -d ' ' -f 2 | head -1
C9300-48P
wolf@linux:~$ 

Это было в Linux. Я планировал написать аналогичный код в Python.

Моя попытка, которая на данный момент все еще не сработала.

Определить строку shver

>>> shver = '''cisco C9300-48P (X86) processor with 818597K/6147K bytes of memory.
... Processor board ID FCW2049G03S
... 2048K bytes of non-volatile configuration memory.
... 8388608K bytes of physical memory.
... 1638400K bytes of Crash Files at crashinfo:.
... 11264000K bytes of Flash at flash:.
... 0K bytes of WebUI ODM Files at webui:.
... Model Number                       : C9300-48P
... 
... Base Ethernet MAC Address          : 04:6c:9d:01:3b:80
... Motherboard Assembly Number        : 73-17956-04
... Motherboard Serial Number          : FOC20465ABU
... Model Revision Number              : P4B
... Motherboard Revision Number        : 04
... Model Number                       : C9300-48P
... System Serial Number               : FCW2049G03S
... '''
>>> 

проверить

>>> shver
'cisco C9300-48P (X86) processor with 818597K/6147K bytes of memory.\nProcessor board ID FCW2049G03S\n2048K bytes of non-volatile configuration memory.\n8388608K bytes of physical memory.\n1638400K bytes of Crash Files at crashinfo:.\n11264000K bytes of Flash at flash:.\n0K bytes of WebUI ODM Files at webui:.\nModel Number                       : C9300-48P\n\nBase Ethernet MAC Address          : 04:6c:9d:01:3b:80\nMotherboard Assembly Number        : 73-17956-04\nMotherboard Serial Number          : FOC20465ABU\nModel Revision Number              : P4B\nMotherboard Revision Number        : 04\nModel Number                       : C9300-48P\nSystem Serial Number               : FCW2049G03S\n'
>>> 

создать список

>>> shver_list = shver.splitlines()
>>> shver_list
['cisco C9300-48P (X86) processor with 818597K/6147K bytes of memory.', 'Processor board ID FCW2049G03S', '2048K bytes of non-volatile configuration memory.', '8388608K bytes of physical memory.', '1638400K bytes of Crash Files at crashinfo:.', '11264000K bytes of Flash at flash:.', '0K bytes of WebUI ODM Files at webui:.', 'Model Number                       : C9300-48P', '', 'Base Ethernet MAC Address          : 04:6c:9d:01:3b:80', 'Motherboard Assembly Number        : 73-17956-04', 'Motherboard Serial Number          : FOC20465ABU', 'Model Revision Number              : P4B', 'Motherboard Revision Number        : 04', 'Model Number                       : C9300-48P', 'System Serial Number               : FCW2049G03S']
>>> 

Следующий шаг - выяснить, присутствует ли строка «Номер модели», и распечатать эту строку

>>> if 'Model Number' in shver_list:
...     'yes'
... else:
...     'no'
... 
'no'
>>> 

Как распечатать строку, содержащую «Номер модели»?

>>> for i in shver_list:
...     if 'Model Number' in shver_list:
...             i
... 
>>> 

Желаемый результат

C9300-48P

Ответы [ 3 ]

1 голос
/ 29 мая 2020

Вы должны отфильтровать записи в вашем списке. Если вы фильтруете напрямую, вы ищете строки, которые буквально обозначают «Номер модели».

Это напечатает все строки, содержащие подстроку «Номер модели».

modelnumbers = [line for line in shver_list if 'Model Number' in line]
print(modelnumbers)`

Чтобы получить желаемый результат, вы используете первый результат и удаляете все, что не нужно.

print(modelnumbers[0].split(":")[1].strip())
1 голос
/ 29 мая 2020

На шаге shver_list вы можете сделать это:

for item in shver_list:
    if "Model Number" in item:
        break

Итак, как только он найдет совпадение, он вырвет l oop и посмотрите, что у нас есть в item:

>>> item
'Model Number                       : C9300-48P'

Теперь мы можем разделить это на : (обратите внимание на пробелы вокруг) и получить:

>>> items.split(" : ")
['Model Number                      ', 'C9300-48P']

Итак, желаемый элемент находится на 1-й позиции в этом списке.

Всего:

for item in shver_list:
    if "Model Number" in item:
        break
desired = item.split(" : ")[1]

Другой способ - использовать регулярные выражения. На этот раз мы берем его из shver строки:

import re
matches_gen = re.finditer(r"Model Number\s+:\s*(.+)", shver)
desired = next(matches_gen).group(1)

Мы используем finditer для ленивого вычисления, и поскольку нам нужно первое вхождение, мы используем для него один next и берем соответствующую группу в получить желаемый результат C9300-48P.

1 голос
/ 29 мая 2020

Вы можете проанализировать данные в словаре, что упрощает доступ к соответствующей информации:

shver = '''cisco C9300-48P (X86) processor with 818597K/6147K bytes of memory.
Processor board ID FCW2049G03S
2048K bytes of non-volatile configuration memory.
8388608K bytes of physical memory.
1638400K bytes of Crash Files at crashinfo:.
11264000K bytes of Flash at flash:.
0K bytes of WebUI ODM Files at webui:.
Model Number                       : C9300-48P

Base Ethernet MAC Address          : 04:6c:9d:01:3b:80
Motherboard Assembly Number        : 73-17956-04
Motherboard Serial Number          : FOC20465ABU
Model Revision Number              : P4B
Motherboard Revision Number        : 04
Model Number                       : C9300-48P
System Serial Number               : FCW2049G03S
'''

attributes = {}

for line in shver.splitlines():
    if ':' in line:  # we just take lines that contain a colon
        item, value = line.strip().split(':', 1)  # Split at the first colon!
        attributes[item.strip()] = value.strip()  # remove all whitespaces

print(attributes['Model Number'])
print(attributes['System Serial Number'])

Вывод:

C9300-48P
FCW2049G03S
...