Still trying to get a grep -c that works


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Still trying to get a grep -c that works
# 1  
Old 04-22-2008
Still trying to get a grep -c that works

I am trying to get a count of each line

sub runit2 {
my ($file1a, $file2a) = @_;
my $file1_vala = $file1a->get;
my $file2_vala = $file2a->get;
open (FILE1a, "$file1_vala") or die;
open (FILE2a, "$file2_vala") or die;
chomp(my @strings = <FILE2a>);
while (1) {
foreach $pattern (<FILE1a>) {
chomp($pattern);
last if $pattern =~ /^\s*$/;
my @matches = eval {
grep $pattern eq $_, @strings;
};
if ($@) {
print "Error: $@";
} else {
my $count = @matches;
print "$count $pattern \n",
#$text->insert('end', "$count $pattern $_\n");
}
}
return;
}





1 ip routing
1 ip classless
1 no ip bootp server
1 no ip http server
1 no ip http secure-server
1 ip bgp-community new-format
1 no access-list 23
1 no access-list 51
1 logging buffered 4096 debugging
1 banner motd ^
6 *************************************************
6**************************************************
2 ^
1 banner exec ^
6**************************************************
2 * LEGAL NOTICE *
6 ***************************************************
6 ***************************************************
2 * LEGAL NOTICE *
6 ****************************************************
2 ^
1 ip dhcp excluded-address 10.8.26.1 10.8.26.100
1 ip dhcp excluded-address 10.8.26.200 10.8.26.254
1 no auto-summary
1 snmp-server view BLOCK iso included
1 snmp-server view BLOCK ipAddrEntry.*.*.*.*.* included
1 snmp-server view BLOCK ipAddrEntry.*.10.*.*.* excluded
1 snmp-server view BLOCK ipNetToMediaEntry.*.*.*.*.*.* included
1 snmp-server view BLOCK ipNetToMediaEntry.*.*.10.*.*.* excluded
1 snmp-server view BLOCK atEntry.*.*.*.*.*.*.* included
1 snmp-server view BLOCK atEntry.*.*.*.10.*.*.* excluded
2 snmp-server ifindex persist
2 snmp-server enable traps snmp authentication linkdown linkup coldstart warmstart
1 snmp-server enable traps frame-relay
1 snmp-server enable traps frame-relay subif
1 snmp-server enable traps config
1 ip tacacs source-interface loopback0
1 snmp-server trap-source loopback0
1 ip flow-export source fa0/0
1 ip flow-export version 5 origin-as
1 ip flow-export destination 10.15.1.2 9996
1 ip flow-cache timeout active 1
1 ip flow-cache timeout inactive 15
2 snmp-server ifindex persist
1 logging trap notifications
1 logging source-interface fa0/0
2 snmp-server enable traps snmp authentication linkdown linkup coldstart warmstart
1 privilege exec level 1 traceroute
1 privilege exec level 1 ping
1 privilege exec level 1 show configuration
1 line con 0
2 exec-timeout 5 0
3 login
1 line aux 0
2 exec-timeout 5 0
3 login
1 line vty 0 4
1 exec-timeout 30 0
1 no privilege level 15
1 no access-class 23 in
3 login
1 end


The easiest thing to look at is the 3 login lines. login appears in file 2 3 times. I only want a single output of "3 login" and not that statement every time the script encounters login.
# 2  
Old 04-22-2008
You still want to drop the eval. Trust me on this, it's not doing anything useful.

Save the matches to a hash and print it only at the end. One of the earlier threads where you asked about this had a solution which did that.

Code:
foreach $pattern (<FILE1a>) {
  chomp($pattern);
  last if $pattern =~ /^\s*$/;
  my $matches = grep $pattern eq $_, @strings;
  ++$count{$pattern} if $matches;
}

for my $key (keys %count) {
  print "$count{$key} $key\n";
}

You need to declare %count up at the top if you use strict (which you should). Also the initialization before the for loop can stay as before. The endless while loop I don't understand; what's that for? Also you should probably close your files when you're done with them, especially if this is going to be a subroutine in a bigger program.
# 3  
Old 04-22-2008
Here is the exact sub that I now have in the script

#***********************
sub runit2 {
my ($file1a, $file2a) = @_;
my $file1_vala = $file1a->get;
my $file2_vala = $file2a->get;
open (FILE1a, "$file1_vala") or die;
open (FILE2a, "$file2_vala") or die;
$text->insert('end', "Device config contains: \n");
chomp(my @strings = <FILE2a>);
while (1) {
foreach $pattern (<FILE1a>) {
chomp($pattern);
last if $pattern =~ /^\s*$/;
my @matches = eval {
#grep /$pattern/, @strings;
grep $pattern eq $_, @strings
};
if ($@) {
print "Error: $@";
} else {
my $count = @matches;
$text->insert('end', "$count $pattern \n");
}
}
return;
}
close FILE1a;
close FILE2a;
}

If I take out the infinite while loop, the output is

"Device config contains:
1 no service tcp-small-servers"

Thats it, no further iteration.

If I leave it in, a snip of the output which is really not desirable ...

.
.
.
.
.
2 snmp-server enable traps snmp authentication linkdown linkup coldstart warmstart
1 snmp-server enable traps frame-relay
1 snmp-server enable traps frame-relay subif
1 snmp-server enable traps config
1 ip tacacs source-interface loopback0
1 snmp-server trap-source loopback0
1 ip flow-export source fa0/0
1 ip flow-export version 5 origin-as
1 ip flow-export destination 10.15.1.2 9996
1 ip flow-cache timeout active 1
1 ip flow-cache timeout inactive 15
2 snmp-server ifindex persist
1 logging trap notifications
1 logging source-interface fa0/0
2 snmp-server enable traps snmp authentication linkdown linkup coldstart warmstart
1 privilege exec level 1 traceroute
1 privilege exec level 1 ping
1 privilege exec level 1 show configuration
1 line con 0
2 exec-timeout 5 0
3 login
1 line aux 0
2 exec-timeout 5 0
3 login
1 line vty 0 4
1 exec-timeout 30 0
1 no privilege level 15
1 no access-class 23 in
3 login
1 end



If I modify the code above to

#***********************
sub runit2 {
my ($file1a, $file2a) = @_;
my $file1_vala = $file1a->get;
my $file2_vala = $file2a->get;
open (FILE1a, "$file1_vala") or die;
open (FILE2a, "$file2_vala") or die;
$text->insert('end', "Device config contains: \n");
#*******************************
foreach $pattern (<FILE1a>) {
chomp($pattern);
last if $pattern =~ /^\s*$/;
my $matches = grep $pattern eq $_, @strings;
++$count{$pattern} if $matches;
}

for my $key (keys %count) {
print "$count{$key} $key\n";
}
#*******************************
close FILE1a;
close FILE2a;
}

I would expect the hash to be printed in the "dos" window.

If the following is included, I get very many errors.

use strict
%count = ();

If omitted, nothing is printed to the dos window, but it does run.
# 4  
Old 04-22-2008
Sorry ...

This line is also included in sub ..

chomp(my @strings = <FILE2a>);

Hosed my cut and paste.
# 5  
Old 04-22-2008
When you use strict, all of your code needs to be strict. It's a hassle at first but it's useful when you start getting useful warnings when the code doesn't do what you expect. If your code is not strict, tackle that later. But adopt it in the next script you write. It's good for you.

The last will quit the foreach loop on the first blank or empty line. If you have empty lines in the patterns file, you probably mean "next", not "last".

If you have the same pattern multiple times in the pattern file, you will get multiple prints of the count of matches. I was under the impression that you were getting 1 login 2 login 3 login but now I see that you have 3 login 3 login 3 login, so it's simply reporting the same pattern multiple times. Welp, you can use a hash to prevent that, too.

Code:
sub runit2 {
  my ($file1a, $file2a) = @_;
  my $file1_vala = $file1a->get;
  my $file2_vala = $file2a->get;
  open (FILE1a, "$file1_vala") or die;
  open (FILE2a, "$file2_vala") or die;
  chomp(my @strings = <FILE2a>);
  close FILE2a;
  $text->insert('end', "Device config contains: \n");
  #*******************************
  foreach $pattern (<FILE1a>) {
    next if $pattern =~ /^\s*$/;
    next if $handled{$pattern};
    $handled{$pattern} = 1;
    chomp($pattern);
    my $matches = grep $pattern eq $_, @strings;
    next unless $matches;
    $text->insert('end', "$matches $pattern \n");
  }
  close FILE1a;
}


Last edited by era; 04-22-2008 at 05:55 PM.. Reason: Optimize so $handled goes before grep
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Grep -q not works with multiples grep in same line

Hi, I'm trying to make a grep to see if exists occurrences with a sentence like these: grep -qi "message" file0 | grep -i $date | grep -vi "exception" echo $? 1 If I execute without -q modifier I can find occurrences. Someone could help me please? Thanks and sorry for my English! (1 Reply)
Discussion started by: mierdatuti
1 Replies

2. Shell Programming and Scripting

Grep works on Linux but fails on Solaris

Hi, On linux i have the below command working fine. grep -o '<name>.*</name>' deploy.tmp | sed 's/\(<name>\|<\/name>\)//g' deploy.tmp But the same is failing on Solaris uname -a SunOS mymac 5.10 Generic_150400-23 sun4v sparc sun4v Can you tell me how can i get it work on Solaris ?... (6 Replies)
Discussion started by: mohtashims
6 Replies

3. 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

4. UNIX for Dummies Questions & Answers

Need a visual grep tool that works on windows via sftp

Hi, Could you please suggest a tool that connects like WINSCP/Putty and allows me to search a remote Unix directory for a certain text pattern (grep) ? Regards, Bhanja. (1 Reply)
Discussion started by: bhanja_trinanja
1 Replies

5. UNIX for Advanced & Expert Users

How this works?

I have a program............ #include<stdio.h> #include<unistd.h> main() { if(fork == 0) { printf("Hi every body:p!!!!!!!!!!"); } } This program works with out any error. here fork is not a system call. It just act as a variable.But how it works without declaring it? What data type it... (19 Replies)
Discussion started by: carolsanjeevi
19 Replies

6. Shell Programming and Scripting

how it works ? sftp

Hi, I am curious about this script , how it is running ..? #!/bin/sh echo "OK, starting now..." ftp remotehost <<EOF When I run , it is asking OK, starting now... Password:Name (remotehost): SHould I enter only password ? and explain me how it works.. thanks in advance.. (3 Replies)
Discussion started by: hegdeshashi
3 Replies

7. UNIX for Dummies Questions & Answers

>./a.pl works, >a.pl - does not

When I try to execute script, I get message: >aa.pl zsh: command not found: aa.pl but >./aa.pl works OK. What to change in environment to force the former way to work? Thank you, Alex Z (4 Replies)
Discussion started by: zzol
4 Replies

8. Programming

how this works?

pls explain me how this works.... DECODE (SUBSTR (field, 1, 1),'''', '''''' || field || '''','''' || field || '''') here field is a column in an oracle table.... (7 Replies)
Discussion started by: vijay_0209
7 Replies

9. UNIX for Dummies Questions & Answers

How ls | wc -l works?

ls displays files in tabbed output. Say a directory contains 3 files. ls will list all 3 in one line. So, I expect ls | wc -l to give 1, but it counts the nr of files and gives 3. Can someone explain how this works? (3 Replies)
Discussion started by: krishmaths
3 Replies

10. UNIX for Dummies Questions & Answers

How the for loop works?

Hi, I have a landing area where some files keep on coming after irregular intervals of time. From this landing area, I need to move files to another directory for processing. For this, I am using a for loop to find certain kinds of files in the landing area. Now my question is, suppose I start... (6 Replies)
Discussion started by: neelaksh
6 Replies
Login or Register to Ask a Question