search a file between two begin and end strings in c


 
Thread Tools Search this Thread
Top Forums Programming search a file between two begin and end strings in c
# 1  
Old 09-15-2011
Question search a file between two begin and end strings in c

Can any one help me out with following problem...

I want to search in a file which has two strings repeat each time(like start and end) i want to search between these two string in C programming.
please help me with the solution.

thanks in advance.
# 2  
Old 09-15-2011
I think it's close to bulletproof:
Code:
$ cat between.c
#include <stdio.h>

int main(void)
{
        const char *start="START", *end="END";

        while(!feof(stdin))
        {
                int c, spos=0;

                while((c=fgetc(stdin)) >= 0)
                {
                        // If it doesn't match, ignore it and start over.
                        if(c != start[spos])
                        {
                                spos=0;
                                // if it doesn't match start[n], it might
                                // match start[0], so check again.
                                if(c != start[0])
                                        continue;
                        }

                        // Increment position in the START string
                        // and check if we found a complete START.
                        if(start[++spos] == '\0') // complete START
                                break;
                }

                if(c<0) break; // No START, just EOF

                spos=0;
                // Search for END
                while((c=fgetc(stdin)) >= 0)
                {
                        if(c != end[spos])
                        {
                                int n;
                                // This time, we have to print everything
                                // we can prove didn't match.
                                fwrite(end, spos, 1, stdout);
                                spos=0;
                                if(c != end[0])
                                {
                                        fputc(c, stdout);
                                        continue;
                                }
                        }

                        if(end[++spos] == '\0') // complete END
                        {
                                // print a newline after each END is found
                                fputc('\n', stdout);
                                break;
                        }
                }
        }

        return(0);
}
$ gcc between.c
$ echo "STSTART A END B START C ENEND D" | ./a.out
 A
 C EN
$

This User Gave Thanks to Corona688 For This Post:
# 3  
Old 09-20-2011
Error search a file between two begin and end strings in c

I have a file with the following content i need to get the Timestamp,Elapsetime, and calculate the averages of the Elapsedtime, for perticulaer process and need to display the process name, the process is NEWOLUF2

BEGINTRANS
logging.c/LogTransactionInput (3105) : Timestamp <14Sep1111-07-37> Input <NEWOLUF2!NEWOLUF2<?xml version="1.0" standalone="yes
"?><OLUF2><INPUT><FLT>SK 1467</FLT><LEG>OSLCPH</LEG><DEPDATE>27SEP11</DEPDATE><BUCKET>Y</BUCKET><BUCKETBKGCL>Y</BUCKETBKGCL><B
KGCL>Y</BKGCL><PARMS>Y</PARMS><COMMENTS>Y</COMMENTS><WARNINGS>Y</WARNINGS><OPARAMETERS>Y</OPARAMETERS><LOCALAVAPOS>Y</LOCALAVA
POS></INPUT></OLUF2>>
ElapseTime <745> milliseconds
ENDTRANS
BEGINTRANS
logging.c/LogTransactionInput (3105) : Timestamp <14Sep1111-07-37> Input <NEWOLUF2!NEWOLUF2<?xml version="1.0" standalone="yes
"?><OLUF2><INPUT><FLT>SK 1455</FLT><LEG>OSLCPH</LEG><DEPDATE>29SEP11</DEPDATE><BUCKET>Y</BUCKET><BUCKETBKGCL>Y</BUCKETBKGCL><B
KGCL>Y</BKGCL><PARMS>Y</PARMS><COMMENTS>Y</COMMENTS><WARNINGS>Y</WARNINGS><OPARAMETERS>Y</OPARAMETERS><LOCALAVAPOS>Y</LOCALAVA
POS></INPUT></OLUF2>>
ElapseTime <765> milliseconds
ENDTRANS
BEGINTRANS
logging.c/LogTransactionInput (3105) : Timestamp <14Sep1111-07-37> Input <<NAVSREQUEST><FLT>SK 4417 </FLT><LEG>TOSOSL</LEG><DE
PDATE>02SEP12</DEPDATE></NAVSREQUEST>>
ElapseTime <579> milliseconds
ENDTRANS
BEGINTRANS
logging.c/LogTransactionInput (3105) : Timestamp <14Sep1111-07-38> Input <<NAVSREQUEST><FLT>SK 1467 </FLT><LEG>OSLCPH</LEG><DE
PDATE>27SEP11</DEPDATE></NAVSREQUEST>>
ElapseTime <356> milliseconds
ENDTRANS
BEGINTRANS
logging.c/LogTransactionInput (3105) : Timestamp <14Sep1111-07-38> Input <<NAVSREQUEST><FLT>SK 1455 </FLT><LEG>OSLCPH</LEG><DE
PDATE>29SEP11</DEPDATE></NAVSREQUEST>>
ElapseTime <390> milliseconds
ENDTRANS
BEGINTRANS
logging.c/LogTransactionInput (3105) : Timestamp <14Sep1111-07-41> Input <DEPLEGS!1!CMD=0#STAT=0#MAXREC= 8#FLT=SK 1467 #DEPDAT
E=18SEP11>
ElapseTime <286> milliseconds
ENDTRANS
BEGINTRANS
logging.c/LogTransactionInput (3105) : Timestamp <14Sep1111-07-41> Input <NEWOLUF2!NEWOLUF2<?xml version="1.0" standalone="yes
"?><OLUF2><INPUT><FLT>SK 1467</FLT><LEG>OSLCPH</LEG><DEPDATE>18SEP11</DEPDATE><BUCKET>Y</BUCKET><BUCKETBKGCL>Y</BUCKETBKGCL><B
KGCL>Y</BKGCL><PARMS>Y</PARMS><COMMENTS>Y</COMMENTS><WARNINGS>Y</WARNINGS><OPARAMETERS>Y</OPARAMETERS><LOCALAVAPOS>Y</LOCALAVA
POS></INPUT></OLUF2>>
ElapseTime <651> milliseconds
ENDTRANS
BEGINTRANS
logging.c/LogTransactionInput (3105) : Timestamp <14Sep1111-07-42> Input <<NAVSREQUEST><FLT>SK 1467 </FLT><LEG>OSLCPH</LEG><DE
PDATE>18SEP11</DEPDATE></NAVSREQUEST>>
ElapseTime <292> milliseconds
ENDTRANS
BEGINTRANS
logging.c/LogTransactionInput (3105) : Timestamp <14Sep1111-07-52> Input <DEPLEGS!1!CMD=0#STAT=0#MAXREC= 8#FLT=SK 0811 #DEPDAT
E=02SEP12>
ElapseTime <345> milliseconds
# 4  
Old 09-20-2011
Why not continue this in your original thread?

Last edited by jim mcnamara; 09-20-2011 at 05:04 PM.. Reason: Threads merged
# 5  
Old 09-21-2011
Error

This is not possible because i need to search for the NEWOLUF2 and get the Elapsetime,Timestamp for the same string but these TWO are in different lines so how can i search and get the values exactly.
# 6  
Old 09-21-2011
Is that what the data looks like, or are the lines actually really long?

---------- Post updated at 11:06 AM ---------- Previous update was at 10:50 AM ----------

Will the process name always be NEWOLUF2?

---------- Post updated at 11:16 AM ---------- Previous update was at 11:06 AM ----------

Here's what I have so far, assuming the long lines were wrapped accidentally. It's much, much, much easier to write when you know what you're supposed to be operating on Smilie

Code:
$ cat begintrans.c
#include <stdio.h>
#include <string.h>

int main(void)
{
	char buf[16384];

	int transcount=0, elapsetotal=0;

	while(!feof(stdin))
	{
		int newoluf=0, elapsetime=-1;
		char timestamp[64]={0};

		buf[0]='\0';	// Blank out buffer

		while(strcmp(buf, "BEGINTRANS\n") != 0)	// look for BEGINTRANS
		if(fgets(buf, 16384, stdin) == NULL)
			break;	// EOF

		if(feof(stdin)) break;

		while(strcmp(buf, "ENDTRANS\n") != 0)	// Look for ENDTRANS
		{
			const char *tsstr;
			if(fgets(buf, 16384, stdin) == NULL)
				break;

			if(strstr(buf, "NEWOLUF2") != NULL)
				newoluf=1;

			if(tsstr=strstr(buf, "Timestamp"))
				sscanf(tsstr, "Timestamp <%[^>]>", timestamp);

			if(strncmp(buf, "ElapseTime", 10) == 0)
				sscanf(buf, "ElapseTime <%d>", &elapsetime);
		}

		if((elapsetime>=0) && (timestamp[0]))
		{
			transcount++;
			elapsetotal += elapsetime;
			printf("trans %d, elapsetime %d, timestamp %s\n",
				transcount, elapsetime, timestamp);
		}
	}

	printf("Average elapsetime is %d\n", elapsetotal / transcount);
	return(0);
}
$ gcc begintrans.c -o begintrans
$ ./begintrans < data
trans 1, elapsetime 745, timestamp 14Sep1111-07-37
trans 2, elapsetime 765, timestamp 14Sep1111-07-37
trans 3, elapsetime 579, timestamp 14Sep1111-07-37
trans 4, elapsetime 356, timestamp 14Sep1111-07-38
trans 5, elapsetime 651, timestamp 14Sep1111-07-41
trans 6, elapsetime 292, timestamp 14Sep1111-07-42
trans 7, elapsetime 345, timestamp 14Sep1111-07-52
Average elapsetime is 533
$

This User Gave Thanks to Corona688 For This Post:
# 7  
Old 09-22-2011
This is only for the process NEWOLUF2 after this i'll change to other process and the content is in a file from the file we have to read the data and perform the task the exact scenario is as follows..

Please write a C program that give us sufficient performance statistics on the WSodrms server.
The program name should be WSodrmsStatistics.c.


The program should do the folloiwing:

1) It should have -s -e options to read start and end of timer interval we want to measure.
2) Scan throgh the log file and pick all NEWOLUF2 tranactions from the logfile within the user defined time interval
3) Save the TimeStamp and ElapseTime in a structure, which you add to a list with AddToTailAL():

typdef struct {
char *strTransactionName[LEN_TRANS_NAME + 1];
int intTimeStamp;
int intElapseTime;
}

3) Calculate the average value over the elements in the list.
4) Print with Logging functions (LOGTYPE_NOPREFIX) the following information:
Transaction name = <strTransactionName> TimeInterval <HHMISS - HHMISS> Average Elapse Time: <XX.XX>
show the result in Seconds with 2 decimals (SS.SS)
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

File write begin/end, recording time

Hello all, How can I find out the start and end of the writing file in the directory or recording time for writing file? I have a directory where small ~ 1*MB temporary files are written. After the end of the record, they are retrieved and erased. I can only find out that the files are... (4 Replies)
Discussion started by: mrAibo
4 Replies

2. UNIX for Beginners Questions & Answers

Grep/awk using a begin search pattern and end search pattern

I have this fileA TEST FILE ABC this file contains ABC; TEST FILE DGHT this file contains DGHT; TEST FILE 123 this file contains ABC, this file contains DEF, this file contains XYZ, this file contains KLM ; I want to have a fileZ that has only (begin search pattern for will be... (2 Replies)
Discussion started by: vbabz
2 Replies

3. UNIX for Dummies Questions & Answers

Search a file for certain strings and add them to the end of certain lines

I have a log file which lists groups and users in the following format GROUP1 user1 user2 user3 GROUP2 user4 user5 user6 GROUP3 user7 user8 I need to change the format to: user1|GROUP1 user2|GROUP1 user3|GROUP1 user4|GROUP2 (3 Replies)
Discussion started by: Angela S
3 Replies

4. Shell Programming and Scripting

Search ad replace using begin and end of the file

Hello Friends , Please help to create script for compare and replace if not matches of set of lines . * Primary* Servername Server1 Location R201 Rack 4 *End Primary* *Secondary* Server Name Server1 IPAddress 10.24.30.10 Application Apache *End of Secondary* Above... (4 Replies)
Discussion started by: rnary
4 Replies

5. Shell Programming and Scripting

BEGIN and END format in awk

I'm new to awk, trying to understand the basics. I'm trying to reset the counter everytime the program gets a new file to check. I figured in the BEGIN part it would work, but it doesn't. #!/bin/awk -f BEGIN {counter=0} { sum=0 for ( i=1; i<=NF;... (1 Reply)
Discussion started by: guitarist684
1 Replies

6. Shell Programming and Scripting

Get the sum of values in between begin and end in the file

Hi All, test file Begin Script Run at Thu Mar 14 09:24:16 PDT 2013 tst_accounts: ws zip: WS_out_20130313.tar.gz dat: test_20130313.dat count: 63574 loaded: xx pre-merge: xx post-merge: xx timestamp: Thu Mar 14 09:30:42 PDT 2013 tst_accounts: ws zip: WS_out_20130313.tar.gz dat: s_20130313.dat... (6 Replies)
Discussion started by: bmk
6 Replies

7. UNIX for Dummies Questions & Answers

Dump to another file for a begin and end Pattern

Hi All , I am newbie to linux shell scripting , below are the contents of my log file , i want the lines between a begin pattern and a end pattern for an instance , my begin Pattern is "Transaction Begins for Usr" and end pattern is "Transaction Ends for Usr" into another file Sample file... (1 Reply)
Discussion started by: SARAVANANE
1 Replies

8. Shell Programming and Scripting

Use of Begin IF ,END IF END not working in the sql script

Hi I have written a script .The script runs properly if i write sql queries .But if i use PLSQL commands of BEGIN if end if , end ,then on running the script the comamds are getting printed on the prompt . Ex :temp.sql After connecting to the databse at the sql prompt i type... (1 Reply)
Discussion started by: isha_1
1 Replies

9. Shell Programming and Scripting

begin end detection

Hi all, i am new to scripting. i need to write a code to detect begin and end of word that either begins or ends with t,th,d,dh,s,sh i have a set of words in a file containg one word per line. let the filename be aaa.txt. i have an another file bbb.txt which has two lines, just specifying the... (7 Replies)
Discussion started by: blkanth
7 Replies

10. Shell Programming and Scripting

BEGIN END questions

Why would you need to use this in a script? Why can't you just use print to print out what you want printed in the begining and print for what you want at the end. So this: nawk 'BEGIN {print "this is the first line"} {print $1 $2 $3} {print $5 $6} END {print "this is the last line"}' ... (2 Replies)
Discussion started by: llsmr777
2 Replies
Login or Register to Ask a Question