1

この質問のタイトルが正しいかどうかわからないので、背景情報を少し教えてください。2つのテキストファイルがあります。1つはdata.txtと呼ばれ、もう1つはresults.txtと呼ばれます。データファイルには、Ciscoネットワークデバイスでの「showversion」の結果が含まれています。次のようになります。

Cisco IOS Software, s72033_rp Software (s72033_rp-ADVIPSERVICESK9_WAN-M), Version 12.2(33)SXI4, RELEASE SOFTWARE (fc3)
Technical Support: http://www.cisco.com/techsupport
Copyright (c) 1986-2010 by Cisco Systems, Inc.
Compiled Sat 29-May-10 17:54 by prod_rel_team

ROM: System Bootstrap, Version 12.2(17r)SX6, RELEASE SOFTWARE (fc1)

 core-router uptime is 2 years, 5 weeks, 1 day, 5 hours, 47 minutes
Uptime for this control processor is 2 years, 5 weeks, 1 day, 4 hours, 50 minutes
Time since san-qrc1 switched to active is 2 years, 5 weeks, 1 day, 4 hours, 56 minutes
System returned to ROM by reload at 16:12:08 PDT Fri Aug 27 2010 (SP by reload)
System restarted at 16:19:33 PDT Fri Aug 27 2010
System image file is "sup-bootdisk:s72033-advipservicesk9_wan-mz.122-33.SXI4.bin"
Last reload reason: Reload Command



This product contains cryptographic features and is subject to United
States and local country laws governing import, export, transfer and
use. Delivery of Cisco cryptographic products does not imply
third-party authority to import, export, distribute or use encryption.
Importers, exporters, distributors and users are responsible for
compliance with U.S. and local country laws. By using this product you
agree to comply with applicable laws and regulations. If you are unable
to comply with U.S. and local laws, return this product immediately.

A summary of U.S. laws governing Cisco cryptographic products may be found at:
http://www.cisco.com/wwl/export/crypto/tool/stqrg.html

If you require further assistance please contact us by sending email to
export@cisco.com.

cisco WS-C6509-E (R7000) processor (revision 1.5) with 983008K/65536K bytes of memory.
Processor board ID XXXXXXXXXX
SR71000 CPU at 600Mhz, Implementation 0x504, Rev 1.2, 512KB L2 Cache
Last reset from s/w reset
35 Virtual Ethernet interfaces
51 Gigabit Ethernet interfaces
26 Ten Gigabit Ethernet interfaces
1917K bytes of non-volatile configuration memory.
8192K bytes of packet buffer memory.

65536K bytes of Flash internal SIMM (Sector size 512K).
Configuration register is 0x2102

簡単に言えば、data.txtを読み取り、特定の文字列を取り出して、results.txtに入れたいと思います。CSV形式がいいのですが、データを抽出するだけで満足です。

たとえば、スクリプトは、デバイスのホスト名(この場合はコアルーター)、システムイメージファイル名(s72033-advipservicesk9_wan-mz.122-33.SXI4.bin)、稼働時間(2年)などの関連データを引き出します。 、5週間、1日、5時間、47分)、シリアル番号(XXXXXXXX)、およびモデル(WS-C6509-E)。そのすべての情報は、タブ区切り形式でresults.txtに配置されます。

将来的には、さまざまなdata.txtファイルを利用し、データをresults.txtに追加して、データポイントの集計を実行することができます。私はそれが理にかなっていることを望んでいます。私は探しているものに関して検索を試みましたが、私が見つけたもののほとんどは、テキストファイル内の行全体を見つけること、または単語の出現のインデックス番号を取得することについて話します。

最後にもう1つ、Ciscoデバイスのモデルによって、すべての項目が異なります。その周りの言葉は一般的に同じですが、私が探しているアイテムは異なります。あなたが提供できるどんな援助も大いにありがたいです。前もって感謝します。

アップデート

ご提供いただいたスクリプトを利用しましたが、それでも次のように表示されます。

python
Python 2.7.3 (default, Aug  1 2012, 05:16:07) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> with open("data.txt") as infile:
...     text = infile.read()
... 
>>> import re
>>> regex = re.compile(
...     r"""^(?P<device>\S*)           # Match non-whitespace device name
...     \suptime\sis\s                 # Match " uptime is "
...     (?P<uptime>[^\r\n]*)           # Match until end of line --> uptime
...     .*?^System\simage\sfile\sis\s  # Match intervening text
...     "[^:]*:                        # Match from quote to colon
...     (?P<sifilename>[^"]*)          # Match everything until quote --> filename
...     .*?^cisco\s                    # Match intervening text
...     (?P<model>\S*)                 # Match non-whitespace model name
...     .*?^Processor\sboard\sID\s     # Match intervening text
...     (?P<serialno>[^\r\n]*)         # Match until end of line --> serial no""", 
...     re.DOTALL | re.MULTILINE | re.VERBOSE)
>>> match = regex.search(text)
>>> match.groups()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'groups'

問題は、ホスト名が1スペースインデントされていることです。貼り付けると、くぼみが消えました。ただし、コマンド「show version」を発行すると、その1つのスペースインデントが表示されます。上記のコードを実行しようとすると、スクリプトが壊れます。スペースを削除すると、機能します。

4

1 に答える 1

1

次のような文字列にファイルを読み取ることができます。

with open("data.txt") as infile:
    text = infile.read()

次に、正規表現を使用して関連情報を抽出できます。

import re
regex = re.compile(
    r"""^(?P<device>\S*)           # Match non-whitespace device name
    \suptime\sis\s                 # Match " uptime is "
    (?P<uptime>[^\r\n]*)           # Match until end of line --> uptime
    .*?^System\simage\sfile\sis\s  # Match intervening text
    "[^:]*:                        # Match from quote to colon
    (?P<sifilename>[^"]*)          # Match everything until quote --> filename
    .*?^cisco\s                    # Match intervening text
    (?P<model>\S*)                 # Match non-whitespace model name
    .*?^Processor\sboard\sID\s     # Match intervening text
    (?P<serialno>[^\r\n]*)         # Match until end of line --> serial no""", 
    re.DOTALL | re.MULTILINE | re.VERBOSE)
match = regex.search(text)

現在match.groups()含まれているもの:

>>> match.groups()
('core-router', '2 years, 5 weeks, 1 day, 5 hours, 47 minutes', 
's72033-advipservicesk9_wan-mz.122-33.SXI4.bin', 'WS-C6509-E', 'XXXXXXXXXX')

これを使用して、次のように csv ファイルに書き込むことができます。

import csv
with open("results.txt", "a") as outfile:
    outcsv = csv.Writer(outfile)
    outcsv.writerow(match.groups())
于 2012-10-02T06:32:01.817 に答える