Unix/Linux Go Back    

Shell Programming and Scripting Unix shell scripting - KSH, CSH, SH, BASH, PERL, PHP, SED, AWK and shell scripts and shell scripting languages here.

Grep command is not search the complete pattern

Shell Programming and Scripting


Closed    
 
Thread Tools Search this Thread Display Modes
    #1  
Old Unix and Linux 06-25-2013
sumit.vedi1988 sumit.vedi1988 is offline
Registered User
 
Join Date: May 2012
Last Activity: 25 June 2013, 6:28 AM EDT
Posts: 1
Thanks: 0
Thanked 0 Times in 0 Posts
Grep command is not search the complete pattern

I am facing a problem while using the grep command in shell script. Actually I have one file (PCF_STARHUB_20130625_1) which contain below records.

Code:
SH_5.55916.00.00.100029_20130601_0001_NUC.csv.gz|438|3556691115 
SH_5.55916.00.00.100029_20130601_0001_Summary.csv.gz|275|3919504621 
SH_5.55916.00.00.100029_20130601_0001_UI.csv.gz|226|593316831
SH_5.55916.00.00.100029_20130601_0001_US.csv.gz|349|1700116234 
SH_5.55916.00.00.100038_20130601_0001_NUC.csv.gz|368|3553014997
SH_5.55916.00.00.100038_20130601_0001_Summary.csv.gz|276|2625719449 
SH_5.55916.00.00.100038_20130601_0001_UI.csv.gz|226|3825232121 
SH_5.55916.00.00.100038_20130601_0001_US.csv.gz|199|2099616349 
SH_5.75470.00.00.100015_20130601_0001_NUC.csv.gz|425|1627227450

And I have a pattern which is stored in one variable (INPUT_FILE_T), and want to search the pattern from the file (PCF_STARHUB_20130625_1). For that I have used below command

Code:
INPUT_FILE_T="SH?*???????????????US.*" 
grep -h ${INPUT_FILE_T} PCF_STARHUB_20130625_1

The output of above command is coming as below

Code:
SH_5.55916.00.00.100029_20130601_0001_US.csv.gz|349|1700116234

Problem is that only one entry is showing in output (It should contain two entries) output should come like below

Code:
SH_5.55916.00.00.100029_20130601_0001_US.csv.gz|349|1700116234
SH_5.55916.00.00.100038_20130601_0001_US.csv.gz|199|2099616349

Is there any technique except grep please tell me.
Please help me on this issue.

Last edited by sumit.vedi1988; 06-25-2013 at 06:11 AM.. Reason: formating
    #2  
Old Unix and Linux 06-25-2013
Don Cragun's Unix or Linux Image
Don Cragun Don Cragun is offline Forum Staff  
Moderator
 
Join Date: Jul 2012
Last Activity: 28 August 2016, 12:32 AM EDT
Location: San Jose, CA, USA
Posts: 9,218
Thanks: 424
Thanked 3,066 Times in 2,638 Posts
The grep utility evaluates basic regular expressions. Unfortunately, ( SH?*???????????????US.* ) is a filename matching pattern; not a BRE.

To search for lines in a file that match a pattern matching expression, try the following shell script using any shell that recognizes basic Bourne shell syntax (such as ksh and bash):

Code:
INPUT_FILE_T="SH?*???????????????US.*"
while IFS='' read -r f
do      case "$f" in
        ($INPUT_FILE_T) printf "%s\n" "$f";;
        esac
done < PCF_STARHUB_20130625_1

Furthermore, since you didn't quote the expansion of $INPUT_FILE_T in your grep command, the shell expanded that variable into a list of matching filenames in the current directory before calling grep; so (assuming that the file PCF_STARHUB_20130625_1 contained a list of some of the files in the current directory) the command that you ran was expanded by the shell to:

Code:
grep -h SH_5.55916.00.00.100029_20130601_0001_US.csv.gz|349|1700116234 SH_5.55916.00.00.100038_20130601_0001_US.csv.gz|199|2099616349 PCF_STARHUB_20130625_1

which treated SH_5.55916.00.00.100029_20130601_0001_US.csv.gz|349|1700116234 as a basic regular expression that happens to match itself when looking in the file PCF_STARHUB_20130625_1 and, fortunately, doesn't seem to have matched any lines in the file named SH_5.55916.00.00.100038_20130601_0001_US.csv.gz|199|2099616349 .

To use grep instead of a loop in the shell, you could translate the filename matching pattern SH?*???????????????US.* to a corresponding BRE ( SH..*...............US[.].* or more succinctly SH.\{16,\}US[.].* ) and use:

Code:
INPUT_FILE_T_BRE="SH.\{16,\}US[.].*"
grep "$INPUT_FILE_T_BRE" PCF_STARHUB_20130625_1

Note that the double quotes in the above grep command are crucial to keep the shell from trying to expand the BRE as a filename matching pattern
    #3  
Old Unix and Linux 06-25-2013
rbatte1 rbatte1 is offline Forum Staff  
Moderator
 
Join Date: Jun 2007
Last Activity: 26 August 2016, 12:15 PM EDT
Location: Lancashire, UK
Posts: 2,593
Thanks: 970
Thanked 470 Times in 425 Posts
It could be as simple as quoting your search string:-
Code:
grep -h "${INPUT_FILE_T}" PCF_STARHUB_20130625_1

It's an odd search string though. From the man page I have on RHEL 6.1, I have:-

Code:
A regular expression may be followed by one of several repetition operators:
      ?      The preceding item is optional and matched at most once.
      *      The preceding item will be matched zero or more times.
      +      The preceding item will be matched one or more times.
      {n}    The preceding item is matched exactly n times.
      {n,}   The preceding item is matched n or more times.
      {,m}   The preceding item is matched at most m times.
      {n,m}  The preceding item is matched at least n times, but not more than m times.

So that you mean that you are looking for a record that starts (doesn't have to be at the beginning of the line) with an S, then the H is optional and then I get confused.

Are you trying to use the ? as a single character each time?

I would think a better search string would be more like:-
Code:
INPUT_FILE_T="^SH....................................US"

to represent Start of line, SH, then any 3 characters, then US. The remainder of the line can be ignored.


Do either of these meet your needs?



Robin
Liverpool/Blackburn
UK

Last edited by rbatte1; 06-25-2013 at 09:59 AM.. Reason: Grammar
Closed

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Linux More UNIX and Linux Forum Topics You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
Pattern search using grep command ! nikesh29 Shell Programming and Scripting 10 03-08-2013 04:01 AM
pipe search pattern into a grep guessingo Shell Programming and Scripting 4 05-04-2012 10:20 AM
search for a pattern using grep manasa_vs Shell Programming and Scripting 7 01-17-2012 06:53 AM
Can grep command return word instead of complete line dashing201 UNIX for Dummies Questions & Answers 11 12-28-2010 04:58 AM
search pattern by grep vijaysabari Shell Programming and Scripting 3 06-23-2004 03:03 AM



All times are GMT -4. The time now is 01:09 AM.