Search backwards to certain string


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Search backwards to certain string
# 8  
Old 03-26-2012
Hi.

I'm still not confident that I understand your question, so perhaps these meta-answers may help.

There was a suggested solution from balajesuri in perl that you may have missed. I don't know about the definite timing of the reading-backwards module, and you seem to not be able to install items, but I think that module might be standard. (The sample code I tried in 2010 was almost instantaneous, but that was with a very short file.) If you do not have it, there are other solutions.

Assuming that the suggestion from birei is correct, you could try various means for reversing a file.

You may not have tac or rev, but there are versions available in perl from one of the CPAN projects.

So you could try using any of those:
PPT: tac
( link to rev removed )

Other approaches to producing a reverse copy of a file are, one in sed:
Code:
sed -n '1{
h
}
1 !{
x
H
}
${
x
H
p
}' inputfile

and you could also add line numbers (cat -n), sort in reverse, and remove the line numbers (cut) to get a reverse copy of a file.

Best wishes ... cheers, drl

Last edited by drl; 03-26-2012 at 12:41 PM.. Reason: Removed link to perl rev, it reverses characters on lines.
This User Gave Thanks to drl For This Post:
# 9  
Old 03-26-2012
Quote:
Originally Posted by SaltyDog
Unfortunately we don't have ruby/glark/tac etc installed which is why I was looking towards an sed/awk solution.


corresponding to the previous policy reference before the "CS95869005 No BC record found. Please review urgently" line
............
Code:
# cat data
..............
....
.......
................
....................
CS02010002 Policy "9999998599"
CS13000008 Tax processing was done for 17/03/2012.
..............
....
.......
................
....................
....................
....................
.......................................
CS95869005 No BC1 record found. Please review urgently

========================================================
CS02010002 Policy 9999998599
SS00200001 Change of adress processed
CS13000008 Tax processing was done for 18/03/2012.
CS02010002 Policy 9999999609
CS02010002 Policy 9999999619
CS02010002 Policy 9999999629
CS43500005 Payout Number A0002 is being processed now.
CS43500005 Payout Number A0003 is being processed now.
CS02010002 Policy 9999999639
CS43500005 Payout Number A0001 is being processed now.
CS02010002 Policy 9999999759
========================================================

CS02010002 Policy "9999999899"
....
.......
....
.......
..............
CS43500005 Payout Number A0003 is being processed now.
CS13000008 Tax processing was done for 17/03/2012.
CS95869005 No BC2 record found. Please review urgently
....
.......
....
.......
..............

Code:
# awk -vstart='CS02010002' -vfstop="No BC" -vlstop=" record found. Please review urgently" '
{while(getline){if($0~start)policy=$3;if($0~fstop "[0-9]*" lstop)print policy}}' data
"9999998599"
"9999999899"

This User Gave Thanks to ygemici For This Post:
# 10  
Old 03-27-2012
Quote:
Code:
# awk -vstart='CS02010002' -vfstop="No BC" -vlstop=" record found. Please review urgently" '
{while(getline){if($0~start)policy=$3;if($0~fstop "[0-9]*" lstop)print policy}}' data
"9999998599"
"9999999899"

This is exactly what I was looking for but I can't get it working. I tried the above and then amended it slightly to the following

Code:
awk -v start='CS02010002' -v fstop="CS95869005"  '{while(getline){if($0~start)policy=$3;if($0~fstop)print policy}}'  FILE

but this just gives me


Code:
awk: syntax error near line 1
awk: bailing out near line 1

# 11  
Old 03-27-2012
On Solaris use /usr/xpg4/bin/awk or nawk... Otherwise try this:

Code:
awk '$2=="Policy"{p=$3}$0~s{print p}' s=CS95869005 infile

or for example:

Code:
awk '$2=="Policy"{p=$3}$0~s{print p}' s="No BC record found" infile

This User Gave Thanks to Scrutinizer For This Post:
# 12  
Old 03-27-2012
A completely different approach, but unsuitable for very large files because it does an extra pass of the file for each error found.
Works by numbering the lines in the input stream, finding each occurance of "No BC record found" and then scanning the ten lines above that record for the last occurrence of a record containing "Policy".

Code:
cat -n filename.txt | grep "No BC record found"|awk '{print $1}' | while read E1
do
        # Line ten lines above "No BC record found"
        E2=$((${E1} - 10))
        if [ ${E2} -le 0 ]
        then
                E2=1
        fi
        # Line number one line above "No BC record found"
        E3=$((E1 -1))
        # Search 10 line block to just above "No BC record found"
        sed -n "${E2},${E3}p;${E3}q" filename.txt | \
                grep "Policy" | tail -1 | awk '{print $3}'
done

./scriptname
9999998599
9999999899

... and I know that it has a "cat" command in it !

Last edited by methyl; 03-27-2012 at 01:16 PM.. Reason: spellin
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

How to use a grep search to search for a specific string within multiple directories?

Lets say I have a massive directory which is filled with other directories all filled with different c++ scripts and I want a listing of all the scripts that contain the string: "this string". Is there a way to use a grep search for that? I tried: grep -lr "this string" * but I do not... (3 Replies)
Discussion started by: Circuits
3 Replies

2. Shell Programming and Scripting

Sed: find and replace backwards, until string

Some help please: Need to find string ||(everything in front of it)B0300|| and replace it with ||0|| globally In: 16112121||||0||0||0||0||0||52||52||0||0||0||0||1507200053342B0300||1507200053342B0300||0||0||0||0700 Out: 16112121||||0||0||0||0||0||52||52||0||0||0||0||0||0||0||0||0||0700 ... (4 Replies)
Discussion started by: drbiloukos
4 Replies

3. Shell Programming and Scripting

Search string within a file and list common words from the line having the search string

Hi, Need your help for this scripting issue I have. I am not really good at this, so seeking your help. I have a file looking similar to this: Hello, i am human and name=ABCD. How are you? Hello, i am human and name=PQRS. I am good. Hello, i am human and name=ABCD. Good bye. Hello, i... (12 Replies)
Discussion started by: royzlife
12 Replies

4. Shell Programming and Scripting

Search several string and convert into a single line for each search string using awk command AIX?.

I need to search the file using strings "Request Type" , " Request Method" , "Response Type" and by using result set find the xml tags and convert into a single line?. below are the scenarios. Cat test Nov 10, 2012 5:17:53 AM INFO: Request Type Line 1.... (5 Replies)
Discussion started by: laknar
5 Replies

5. Programming

How to search a file based on a time stamp backwards 10 seconds

Hi all, I'm after some help with this small issue which i'm struggling to work out a fix for. I have a file that contains records that all have a time stamp for each individual record, i need to search the file for a specific time stamp and then search back 10 seconds to see if the number... (2 Replies)
Discussion started by: sp3arsy
2 Replies

6. Shell Programming and Scripting

search for string and replace backwards

I'm new to Unix scripting and I'm not sure if this can be done. Example: search (grep) in a file for 'Control ID' and then replace with 4 blanks 7 bytes before 'Control ID. input "xxxxxx1234xxxxxxxControl IDxxxxxx" output: "xxxxxx xxxxxxxControl IDxxxxxx" thanks! (7 Replies)
Discussion started by: jbt828
7 Replies

7. Shell Programming and Scripting

How to search backwards in a log file by timestamp of entries?

Hello. I'm not nearly good enough with awk/perl to create the logfile scraping script that my boss is insisting we need immediately. Here is a brief 3-line excerpt from the access.log file in question (actual URL domain changed to 'aaa.com'): 209.253.130.36 - - "GET... (2 Replies)
Discussion started by: kevinmccallum
2 Replies

8. Shell Programming and Scripting

search backwards relative to a string

Hi, I have to search for first occurenceof string str1 in a file(>5GB). Now, after I have that , I have to search backwards from that offset till I get another string str2. I should also be able to get the new string str2's offset. Similarly, I look for last occurence of str1 and then... (1 Reply)
Discussion started by: finder255
1 Replies

9. Shell Programming and Scripting

Search backwards

Hi, I have a variable , lets say a=/disk1/net/first.ksh i need to grep "first.ksh" everytime "a" gets changed dynamically and i do not know how many '"/" are there in my variable. Can somebody help me out. (9 Replies)
Discussion started by: giri_luck
9 Replies

10. Shell Programming and Scripting

Perl: Search for string on line then search and replace text

Hi All, I have a file that I need to be able to find a pattern match on a line, search that line for a text pattern, and replace that text. An example of 4 lines in my file is: 1. MatchText_randomNumberOfText moreData ReplaceMe moreData 2. MatchText_randomNumberOfText moreData moreData... (4 Replies)
Discussion started by: Crypto
4 Replies
Login or Register to Ask a Question