Grep


 
Thread Tools Search this Thread
Top Forums UNIX for Dummies Questions & Answers Grep
# 1  
Old 01-07-2016
Grep

my file has one line
Code:
abcdedabxxxxabxxxab

I want to know the #occurrences of substring ab and their positions

Following command gives me

Code:
 >grep ab -o file|wc
 4       4      12

Is the first 4, the number of occurrences of ab? what are other numbers.
Can I get their positions in a one liners?
thanks

Last edited by Don Cragun; 01-07-2016 at 04:58 PM.. Reason: Add CODE and ICODE tags.
# 2  
Old 01-07-2016
man wc:
Quote:
DESCRIPTION
Print newline, word, and byte counts ...
If your awk allows for multichar field separators, try
Code:
awk -F"ab" '{L = length(FS); T = -1; for (i=1; i<NF; i++) print T += length($i) +  L}' file1
1
7
13
18

# 3  
Old 01-07-2016
Short answer is no. The first number 4 is the offset (-b) for GNU grep.

You can use sed with grep, but it is somewhat awkward. Another approach is awk.
(nawk is solaris)
Code:
  nawk '{
             while (length($0)>=2)
             {
               lcnt++
               if(substr($0,1,2)=="ab")
               {
                  print "position", lcnt
                  count++
               }
               $0=substr($0,2)
              }
            }
        END {print count, "occurences"} ' infile

My data file: $ cat infile
Code:
abedcabsabwqsab

# 4  
Old 01-07-2016
thanks a ton, this is exactly what I was looking for.
# 5  
Old 01-07-2016
Quote:
Originally Posted by RudiC
man wc:

If your awk allows for multichar field separators, try
Code:
awk -F"ab" '{L = length(FS); T = -1; for (i=1; i<NF; i++) print T += length($i) +  L}' file1
1
7
13
18

I think every version of awk allows FS to be set to:
  • a single character (using that single character as the field separator), and
  • a multi-character extended regular expression (using every string matching that ERE as the field separator).
Some implementations of awk allow FS to be set to an empty string to treat each character in an input record as a field.

The standards only specify the behavior of awk when RS (not FS) is a single character. Some versions of awk also treat a multi-character string in RS to use any string matching the ERE specified by that multi-character string to be used as the input record separator; others only use the first character of RS as the record separator.
# 6  
Old 01-09-2016
Quote:
Originally Posted by prak705
my file has one line
Code:
abcdedabxxxxabxxxab

In such a case (notice: ONLY in such a case, where the content is only one line long) one might be better off without using any external programs. One can do what you want to do with shell built-ins only (i use ksh93 here):

Code:
search="ab"                  # our search string
var=$(</path/to/file)        # read the file content into a variable
print - ${#var}              # display the length of the string
varnew=${var//${search}/}    # remove every instance of the search string from the content and store the result

print - $(( ( ${#var} - ${#varnew} ) / ${#search} ))

The last line takes the difference in length before and after removal of the search string and divides the result by the length of the search string, getting the number of occurences.

I haven't tested the execution speed yet but my prediction is that it is much faster than a call to awk or any other external tool.

I hope this helps.

bakunin
# 7  
Old 01-09-2016
@bakunin, wouldn't you need a loop to get the positions?
 
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Inconsistent `ps -eaf -o args | grep -i sfs_pcard_load_file.ksh | grep -v grep | wc -l`

i have this line of code that looks for the same file if it is currently running and returns the count. `ps -eaf -o args | grep -i sfs_pcard_load_file.ksh | grep -v grep | wc -l` basically it is assigned to a variable ISRUNNING=`ps -eaf -o args | grep -i sfs_pcard_load_file.ksh |... (6 Replies)
Discussion started by: wtolentino
6 Replies

2. UNIX for Dummies Questions & Answers

Piping grep into awk, read the next line using grep

Hi, I have a number of files containing the information below. """"" Fundallinfo 6.3950 14.9715 14.0482 """"" I would like to grep for Fundallinfo and use it to read the next line? I ideally would like to read the three numbers that follow in the next line and... (2 Replies)
Discussion started by: Paul Moghadam
2 Replies

3. UNIX for Dummies Questions & Answers

Bash - CLI - grep - Passing result to grep through pipe

Hello. I want to get all modules which are loaded and which name are exactly 2 characters long and not more than 2 characters and begin with "nv" lsmod | (e)grep '^nv???????????? I want to get all modules which are loaded and which name begin with "nv" and are 2 to 7 characters long ... (1 Reply)
Discussion started by: jcdole
1 Replies

4. Shell Programming and Scripting

AWK/GREP: grep only lines starting with integer

I have an input file 12.4 1.72849432773174e+01 -7.74784188610632e+01 12.5 9.59432114416327e-01 -7.87018212757537e+01 15.6 5.20139995965960e-01 -5.61612429666624e+01 29.3 3.76696387248366e+00 -7.42896194101892e+01 32.1 1.86899877018077e+01 -7.56508762501408e+01 35 6.98857157014640e+00... (2 Replies)
Discussion started by: chrisjorg
2 Replies

5. UNIX for Dummies Questions & Answers

Advanced grep'in... grep for data next to static element.

I have a directory I need to grep which consists of numbered sub directories. The sub directory names change daily. A file resides in this main directory that shows which sub directories are FULL backups or INCREMENTAL backups. My goal is to grep the directory for the word "full" and then... (2 Replies)
Discussion started by: SysAdm2
2 Replies

6. UNIX for Dummies Questions & Answers

Difference between grep, egrep & grep -i

Hi All, Please i need to know the difference between grep, egrep & grep -i when used to serach through a file. My platform is SunOS 5.9 & i'm using the korn shell. Regards, - divroro12 - (2 Replies)
Discussion started by: divroro12
2 Replies

7. Shell Programming and Scripting

grep for certain files using a file as input to grep and then move

Hi All, I need to grep few files which has words like the below in the file name , which i want to put it in a file and and grep for the files which contain these names and move it to a new directory , full file name -C20091210.1000-20091210.1100_SMGBSC3:1000... (2 Replies)
Discussion started by: anita07
2 Replies

8. UNIX for Dummies Questions & Answers

| help | unix | grep (GNU grep) 2.5.1 | advanced regex syntax

Hello, I'm working on unix with grep (GNU grep) 2.5.1. I'm going through some of the newer regex syntax using Regular Expression Reference - Advanced Syntax a guide. ls -aLl /bin | grep "\(x\)" Which works, just highlights 'x' where ever, when ever. I'm trying to to get (?:) to work but... (4 Replies)
Discussion started by: MykC
4 Replies

9. UNIX for Dummies Questions & Answers

| help | unix | grep - Can I use grep to return a string with exactly n matches?

Hello, I looking to use grep to return a string with exactly n matches. I'm building off this: ls -aLl /bin | grep '^.\{9\}x' | tr -s ' ' -rwxr-xr-x 1 root root 632816 Nov 25 2008 vi -rwxr-xr-x 1 root root 632816 Nov 25 2008 view -rwxr-xr-x 1 root root 16008 May 25 2008... (7 Replies)
Discussion started by: MykC
7 Replies

10. Shell Programming and Scripting

MEM=`ps v $PPID| grep -i db2 | grep -v grep| awk '{ if ( $7 ~ " " ) { print 0 } else

Hi Guys, I need to set the value of $7 to zero in case $7 is NULL. I've tried the below command but doesn't work. Any ideas. thanks guys. MEM=`ps v $PPID| grep -i db2 | grep -v grep| awk '{ if ( $7 ~ " " ) { print 0 } else { print $7}}' ` Harby. (4 Replies)
Discussion started by: hariza
4 Replies
Login or Register to Ask a Question