0

Question1: I want to extract the data between "Target Information" and the line before "Group Information" and store it as a variable or appropriately.

Question2: Next, I want to extract the data from "Group Information" till the end of the file and store it in a variable or something appropriate.

Question3: With this information in both the above cases, I want to extract the line just after the line which starts with "Name"

From the below code I was able to get the information between "Target Information" and "Group Information" and Captured the data in "required_lines" variable.

Next, I am trying to get the line after the line "Name". But this fails. And can the logic be implemented using regex call?

# Extract the lines between
with open ('showrcopy.txt', 'r') as f:
    file = f.readlines()


required_lines1 = []
required_lines = []
inRecordingMode = False
for line in file:
   
    if not inRecordingMode:
        if line.startswith('Target Information'):
            inRecordingMode = True
    elif line.startswith('Group Information'):
        inRecordingMode = False
    else:

        required_lines.append(line.strip())


print(required_lines)


#Extract the line after the line "Name"  

def gen():
    for x in required_lines:
        yield x

for line in gen():
    if "Name" in line:
        print(next(gen())

showrcopy.txt

root@gnodee184119:/home/usr/redsuren# date; showrcopy -qw
Tue Aug 24 00:20:38 PDT 2021

Remote Copy System Information
Status: Started, Normal

Target Information

Name  ID Type Status Policy        QW-Server                  QW-Ver  Q-Status    Q-Status-Qual     ATF-Timeout
s2976  4 IP   ready  mirror_config https://10.157.35.148:8443 4.0.007 Re-starting Quorum not stable          10

Link Information

Target  Node  Address       Status Options
s2976   0:9:1 192.168.20.21 Up     -
s2976   1:9:1 192.168.20.22 Up     -
receive 0:9:1 192.168.10.21 Up     -
receive 1:9:1 192.168.10.22 Up     -

Group Information

Name                      Target     Status   Role       Mode     Options
SG_hpux_vgcgloack.r518634 s2976      Started  Primary    Sync     auto_recover,auto_failover,path_management,auto_synchronize,active_active
  LocalVV              ID   RemoteVV             ID   SyncStatus    LastSyncTime
  vgcglock_SG_cluster 13496 vgcglock_SG_cluster 28505 Synced        NA

Name                Target     Status   Role       Mode     Options
aix_rcg1_AA.r518634 s2976      Started  Primary    Sync     auto_recover,auto_failover,path_management,auto_synchronize,active_active
  LocalVV         ID   RemoteVV      ID   SyncStatus    LastSyncTime
  tpvvA_aix_r.2  20149 tpvvA_aix.2  41097 Synced        NA
  tpvvA_aix_r.3  20150 tpvvA_aix.3  41098 Synced        NA
  tpvvA_aix_r.4  20151 tpvvA_aix.4  41099 Synced        NA
  tpvvA_aix_r.5  20152 tpvvA_aix.5  41100 Synced        NA
  tpvvA_aix_r.6  20153 tpvvA_aix.6  41101 Synced        NA
  tpvvA_aix_r.7  20154 tpvvA_aix.7  41102 Synced        NA
  tpvvA_aix_r.8  20155 tpvvA_aix.8  41103 Synced        NA
  tpvvA_aix_r.9  20156 tpvvA_aix.9  41104 Synced        NA
  tpvvA_aix_r.10 20157 tpvvA_aix.10 41105 Synced        NA
2
  • 1
    Is the file structure always the same? Same number of lines, same order of info? If so, regex isn't what you want, just manually extract the lines you need using slicing. Otherwise, if the information blocks are always in the same order you could try something like Target Information([\s\S.]*)Group Information, to get everything between those two labels, for example. Commented Aug 24, 2021 at 14:53
  • @blorgon thanks! will help. And how can I extract the line just after the line which starts with a string always, in my case "Name" Commented Aug 24, 2021 at 15:08

1 Answer 1

1

Here's a regex solution to pull the target info and group info:

import re

with open("./showrcopy.txt", "r") as f:
    text = f.read()


target_info_pattern = re.compile(r"Target Information([.\s\S]*)Group Information")
group_info_pattern = re.compile(r"Group Information([.\s\S]*)")

target_info = target_info_pattern.findall(text)[0].strip().split("\n")
group_info = group_info_pattern.findall(text)[0].strip().split("\n")

target_info_line_after_name = target_info[1]
group_info_line_after_name = group_info[1]

And the lines you're interested in:

>>> target_info_line_after_name
's2976  4 IP   ready  mirror_config https://10.157.35.148:8443 4.0.007 Re-starting Quorum not stable          10'

>>> group_info_line_after_name
'SG_hpux_vgcgloack.r518634 s2976      Started  Primary    Sync     auto_recover,auto_failover,path_management,auto_synchronize,active_active'
Sign up to request clarification or add additional context in comments.

2 Comments

what is the difference in with open ('showrcopy.txt', 'r') as f: for line in f: and for line in f.read()
f.read() returns the entire file as a string, for looping over f.read() would iterate over the characters of that string, not the lines.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.