[Last Call] Learn about multicloud storage options and how to improve your company's cloud strategy. Register Now

x
?
Solved

Grep Limit

Posted on 2004-08-23
9
Medium Priority
?
1,161 Views
Last Modified: 2008-03-06

Is there a way to use Grep and set a limit on how far on each line it will search for the string you want.

Ex:
I want to search for a string only if it is in the first 200 characters of the line.

0
Comment
Question by:bt707
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
  • 3
  • 2
9 Comments
 
LVL 21

Expert Comment

by:tfewster
ID: 11876528
How about:
cut -c1-200 filename |grep pattern

The obvious problem is that it will only return the truncated line...but you could use the first pass to generate the a list of matching line numbers and a second pass to extract those (complete) lines, e.g.

for LINE in `grep -n 1 filename | awk -F: '{printf $1 " "}'`
do
  sed -n -s ${LINE}p filename
done

But that would be inefficient for large files, so maybe use awk instead...

awk '{if ( substr($0,1,200) ~ "PATTERN" ) {print $0}}'  filename
0
 

Author Comment

by:bt707
ID: 11876673
that looks like it could do just what i need, don't care about it being truncated, but I'm getting this error when trying to run it.



awk '{if ( substr($0,1,200) ~ "@my.domain.com rfc822" ) {print $0}}' logfile1
awk: syntax error near line 1
awk: illegal statement near line 1
awk: syntax error near line 1
awk: bailing out near line 1
0
 
LVL 23

Expert Comment

by:brettmjohnson
ID: 11876717
You could use the cut command first:

#!/bin/bash
# Must have at least two args: pattern file...

if [ $# -lt 2 ] ; then
cat <<END
usage: $0 pattern files
Looks for regex pattern in first 200 chars of each file.
END

else
  pattern=$1
  shift 1

  for f in "$@" ; do
      tempf=`basename $f`.$$
      grep -H -n ".*" $f | cut -d":" -f1,2 > $tempf
      cut -c1-20 $f | paste -d":" $tempf - | grep -e "$pattern"
      rm -f $tempf
  done
fi


0
Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

 
LVL 23

Expert Comment

by:brettmjohnson
ID: 11876737
Oops, that should be   cut -c1-200  



0
 
LVL 21

Expert Comment

by:tfewster
ID: 11876962
bt707, if I recall correctly, you're running Solaris;  I've just tested it on Solaris 8 using nawk instead of basic awk, and nawk executes without errors:

nawk '{if ( substr($0,1,200) ~ "@my.domain.com rfc822" ) {print $0}}' logfile1
0
 
LVL 21

Expert Comment

by:tfewster
ID: 11877017
This simplified version might work with standard Solaris awk - But  I won't be able to test it until tomorrow now...
awk ' substr($0,1,200) ~ "@my.domain.com rfc822"  {print $0}' logfile1
0
 
LVL 23

Expert Comment

by:brettmjohnson
ID: 11877044
Posted again with minor corrections:

#!/bin/bash
# Must have at least two args: pattern file...
if [ $# -lt 2 ] ; then
cat <<END
usage: $0 pattern files
Looks for regex pattern in first 200 chars of each file.
END

else
  pattern=$1
  shift 1

  for f in "$@" ; do
      tempf=/tmp/`basename $f`.$$
      grep -H -n ".*" $f | cut -d":" -f1,2 > $tempf
      cut -c1-200 $f | paste -d":" $tempf - | grep -h -e "$pattern"
      rm -f $tempf
  done
fi
0
 
LVL 21

Accepted Solution

by:
tfewster earned 2000 total points
ID: 11879351
Here you go: A simple version for a crippled awk ;-)
awk ' substr($0,1,200) ~ /@my.domain.com.rfc822/  ' logfile1

And to answer your next question: Yes - the pattern can be passed as a variable ;-)

PATTERN="@my.domain.com.rfc822"
awk 'substr($0,1,200) ~ /'$PATTERN'/ ' logfile1
0
 

Author Comment

by:bt707
ID: 11879923
tfewster, thanks for all of your great answers, i used this last one and works great, just what I needed, haven't had time to try the other ones but sure they are all good ones.


Thanks again to All:
0

Featured Post

What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

A metadevice consists of one or more devices (slices). It can be expanded by adding slices. Then, it can be grown to fill a larger space while the file system is in use. However, not all UNIX file systems (UFS) can be expanded this way. The conca…
FreeBSD on EC2 FreeBSD (https://www.freebsd.org) is a robust Unix-like operating system that has been around for many years. FreeBSD is available on Amazon EC2 through Amazon Machine Images (AMIs) provided by FreeBSD developer and security office…
Learn several ways to interact with files and get file information from the bash shell. ls lists the contents of a directory: Using the -a flag displays hidden files: Using the -l flag formats the output in a long list: The file command gives us mor…
Learn how to get help with Linux/Unix bash shell commands. Use help to read help documents for built in bash shell commands.: Use man to interface with the online reference manuals for shell commands.: Use man to search man pages for unknown command…
Suggested Courses

650 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question