GREP function in ksh which ignores LINE Breaks


 
Thread Tools Search this Thread
Top Forums UNIX for Dummies Questions & Answers GREP function in ksh which ignores LINE Breaks
# 1  
Old 09-19-2014
GREP function in ksh which ignores LINE Breaks

Hello

I am using a grep command with two patterns in my KSH script. File has line breaks in it and both the patterns are in different lines. Here is the command grep -l 'RITE AID.*ST.820' natriter820u.20140914

Pattern1 - RITE AID
Pattern2 - ST*820

I am not getting any results from this, whereas if I replace this file with a different file having no line breaks then it works. Is there any work around to deal with line breaks here.

Here is the sample data:-

Code:
ISA*00* 00 *ZZ*NATIONSBANK *14*0030020520500 *140918*1200*U*00401*000006436*0*P*^ 
GS*RA*014578892*IGIHCJEEJ*20140918*1200*6442*X*004010
ST*820*000006482 
N1*PR*RITE AID HDQTRS. CORP.*1*014578892

Can someone please help.

Thanks

Last edited by Raghav Garg; 09-19-2014 at 05:19 PM..
# 2  
Old 09-19-2014
Your grep command will not print the sample's filename as it is looking for "RITE AID" coming in front of "ST.820" which will not be the case even with newlines removed.

However, grep does not match patterns across line boundaries, so either remove those (e.g. tr -d '\n') or use other methods, e.g. awk to match either pattern and print the FILENAME when both are found.
# 3  
Old 09-19-2014
grep does not work that way. grep matches lines containing patterns, it does no logic like 'if this line and this line do this thing or this other thing' etc. It's not a programming language.

awk is a programming language, and can.

Code:
$ awk -v P1="pattern1" -v P2="pattern2" '
# set A if P1 found, set B if P2 found
$0~P1{A=1} $0~P2{B=1} 
# If filename changes, and A set, and B set, print filename.  Reset A and B.
(L != ARGIND) { L++; if(A && B) print ARGV[L];  A=B=0 }
# Check A and B for the last filename and print.
END { if(A&&B) print ARGV[L] }' filename1 filename2 filename3 filename4

# 4  
Old 09-19-2014
Quote:
Originally Posted by RudiC
Your grep command will not print the sample's filename as it is looking for "RITE AID" coming in front of "ST.820" which will not be the case even with newlines removed.

However, grep does not match patterns across line boundaries, so either remove those (e.g. tr -d '\n') or use other methods, e.g. awk to match either pattern and print the FILENAME when both are found.
Thanks Rudic, I will correct the first mistake here also I am very new to Unix, will it be possible for you to provide me the with the right command that you think should work with tr -d '\n'
# 5  
Old 09-19-2014
Code:
tr -d '\n' <file | grep ST*820.*RITE AID

# 6  
Old 09-19-2014
Quote:
Originally Posted by Corona688
grep does not work that way. grep matches lines containing patterns, it does no logic like 'if this line and this line do this thing or this other thing' etc. It's not a programming language.

awk is a programming language, and can.

Code:
$ awk -v P1="pattern1" -v P2="pattern2" '
# set A if P1 found, set B if P2 found
$0~P1{A=1} $0~P2{B=1} 
# If filename changes, and A set, and B set, print filename.  Reset A and B.
(L != ARGIND) { L++; if(A && B) print ARGV[L];  A=B=0 }
# Check A and B for the last filename and print.
END { if(A&&B) print ARGV[L] }' filename1 filename2 filename3 filename4

Thanks, I will try and see if it works.. my company is using a pretty old version so I have a limited number of possibilities

---------- Post updated at 03:37 PM ---------- Previous update was at 03:33 PM ----------

Quote:
Originally Posted by RudiC
Code:
tr -d '\n' <file | grep ST*820.*RITE AID

Thanks a lot, I tried tr -d '\n' <natriter820u.20140914 | grep 'ST.820.*RITE AID'

and it gave me the content of the file but I need to get the file name so I tried
tr -d '\n' <natriter820u.20140914 | grep -l 'ST.820.*RITE AID'

It is giving a weird output of <stdin>
# 7  
Old 09-19-2014
Quote:
Originally Posted by Raghav Garg
Thanks, I will try and see if it works.. my company is using a pretty old version so I have a limited number of possibilities
These days, even a wireless router probably has awk. If you're running anything with Linux or UNIX in its name you should have it.

grep prints '<stdin>' because you didn't give it a file name, it was reading from tr instead, through a pipe, also called 'standard input'. So that's not quite what you want.

grep usually has limits on how long a line it will process, and tr -d '\n' turns it into one giant line, so that's not a good solution anyway.

There are ways with grep, involving calling grep multiple times, and possibly sorting and merging its output. I think the awk way is the closest to what you asked for.

Last edited by Corona688; 09-19-2014 at 05:48 PM..
 
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

[BASH] read 'line' issue with leading tabs and virtual line breaks

Heyas I'm trying to read/display a file its content and put borders around it (tui-cat / tui-cat -t(ypwriter). The typewriter-part is a 'bonus' but still has its own flaws, but thats for later. So in some way, i'm trying to rewrite cat using bash and other commands. But sadly it fails on... (2 Replies)
Discussion started by: sea
2 Replies

2. HP-UX

After using @, line breaks for a particular user in shell

Dear Concern, When we using @ sign, line breaks for a particular user in shell. Please advise how to resolve from the problem in HP UX. tabs@tabsdb02:/ccbs/users/tabs$ cat /etc/passwd|grep tabs tabs:RdCgOsmKee7Ps:221:201::/ccbs/users/tabs:/usr/bin/ksh... (3 Replies)
Discussion started by: makauser
3 Replies

3. How to Post in the The UNIX and Linux Forums

GREP function in ksh which ignores LINE Breaks

I am using a grep command with two patterns in my KSH script. File has line breaks in it and both the patterns are in different lines. Here is the command - grep -l 'RITE AID.*ST.820' natriter820u.20140914 Pattern1 - RITE AID Pattern2 - ST*820 I am not getting any results from this,... (3 Replies)
Discussion started by: Raghav Garg
3 Replies

4. UNIX for Dummies Questions & Answers

Page breaks and line breaks

Hi All, Need an urgent solution to an issue . We have created a ksh file or shell script which generates 1 DAT file. the DAT file contains extract of a select statement . Now the issue is , when we are executing the ksh file , the output is coimng with page breaks and line breaks . We have... (4 Replies)
Discussion started by: Ayaskant
4 Replies

5. Shell Programming and Scripting

ksh while read loop breaks after one record - AIX

#!/bin/ksh for SRV in imawasp01 \ imawasp02 \ imawasp03 \ imawasp04 \ imawasp05 \ imawasp06 \ imawasp07 \ imawasp08 \ imawasp09 do print "${SRV}" while read PASSLINE do SRVNAME=`echo ${PASSLINE} | awk -F\: '{print $1}'` LASTLOGIN=`ssh ${SRV} lsuser ${SRVNAME} | tr '... (2 Replies)
Discussion started by: port43
2 Replies

6. Programming

Clean and keep line breaks

Hello, I want to keep line spaces in comments but clean more then 2 after each. Example: $sentence="This is my first sentence This will be in a new row This will be too in a new row but not separated with 3line breaks just with one "; And i want to... (1 Reply)
Discussion started by: AimyThomas
1 Replies

7. Shell Programming and Scripting

While read line ignores the '\' in file content

I need to read temp.$i file content line by line through while loop but somehow the '\' do not appear in output.. Can someone guide how to read this exact content line by line in unix : if then cat temp.$i | head -1 # the file content appears fine while... (13 Replies)
Discussion started by: Prev
13 Replies

8. Shell Programming and Scripting

Help with wc and line breaks

Hi everyone, I have gone through the forum trying to find an answer to this question but was unsuccessful. I am hoping that someone can help me with this please. I am trying to get my script to recognise line breaks from a file and to give me a result for wc of each line. So basically, if you... (7 Replies)
Discussion started by: stargazerr
7 Replies

9. Shell Programming and Scripting

any better way to remove line breaks

Hi, I got some log files which print the whole xml message in separate lines: e.g. 2008-10-01 14:21:44,561 INFO do something 2008-10-01 14:21:44,561 INFO print xml : <?xml version="1.0" encoding="UTF-8"?> <a> <b>my data</b> </a> 2008-10-01 14:21:44,563 INFO do something again I want... (3 Replies)
Discussion started by: csmklee
3 Replies

10. Shell Programming and Scripting

Grep a number from a line in ksh

In file.name, I have a line that reads $IDIR/imgen -usemonths -dropcheck -monitor -sizelimit 80000000 -interval 120 -volcal HSI How can I get the size limit, i.e. 80000000 out and pass it to a variable called SIZE? Thanks. I tried echo "grep sizelimit file.name" | sed -n -e... (3 Replies)
Discussion started by: rodluo
3 Replies
Login or Register to Ask a Question