Looking for an awk command to print strings only if substring is missing


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Looking for an awk command to print strings only if substring is missing
# 1  
Old 04-03-2014
Looking for an awk command to print strings only if substring is missing

I have a file that I need to find each interface that has move-group on the interface line and print this line if the lines under the interface does Not have "filter-shared 14".

Example file:
Code:
interface 1/1/1/0 move-group
     decription one one one zero
     no shut
     filter-shared 14
     accounting-policy 5
     shared-address 0
interface 1/1/1/1 move-group
     decription one one one one
     no shut
     accounting-policy 5
     shared-address 0
interface 1/1/1/2 move-group
     decription one one one two
     no shut
     filter-shared 14
     accounting-policy 5
     shared-address 0
interface 1/1/1/3 move-group
     decription one one one three
     no shut
     accounting-policy 5
     shared-address 0
interface 1/1/1/4 permanent-group
     decription one one one four
     no shut
     accounting-policy 5
     shared-address 0

I only wish to print out the interface line that does have "filter-shared 14" under it.
So the output would look like this:
Code:
interface 1/1/1/1 move-group
interface 1/1/1/3 move-group

# 2  
Old 04-03-2014
Does it have to be AWK? Try this if not:
Code:
perl -ln0e 'while (/(interface[^\n]+).*?(?=interface|$)/sg){$x=$&;$y=$1;print $y if $x!~/filter-shared 14/ && $y=~/move-group/}' file

This User Gave Thanks to bartus11 For This Post:
# 3  
Old 04-03-2014
Stash each interface line in a variable a, and 0 in another b, and as your seaarch forward, look for filter-shared 14, and if you find it, st the second var b to 1, and at the next interface line or EOF if b still a zero, print the stash a before stashing the new interface line. So, in code the last bit comes first!
# 4  
Old 04-03-2014
bartus11, That is a perfect perl line, but the server I need to run this on does not have perl.
# 5  
Old 04-03-2014
One way with awk:
Code:
awk '/^interface/{print x}1' file |
awk '!/filter-shared 14/ && $1~/move-group/{print $1}' FS='\n' RS=

This User Gave Thanks to Scrutinizer For This Post:
# 6  
Old 04-03-2014
Thank you Scrutinizer, that works. But it skips the first line of the file if there is a match. I think it's because x is empty until after the first line.
# 7  
Old 04-04-2014
Hi Numele, I cannot reproduce this skipping of the first line. Could you give an example and could you specify on what OS you are getting this result?

I get:
Code:
interface 1/1/1/1 move-group
interface 1/1/1/3 move-group

If I change "filter-shared 14" of the first record to something else, then the output becomes:
Code:
interface 1/1/1/0 move-group
interface 1/1/1/1 move-group
interface 1/1/1/3 move-group

Note that there are two parts. The first puts empty lines around the records, the "x" is an empty variable, so that an empty line gets printed before that start of each record.

This then enables the second awk to use RS=, a special value so that records can be separated by blank lines and thus become multi-line records. So for example the first record becomes:

Code:
interface 1/1/1/0 move-group
     decription one one one zero
     no shut
     filter-shared 14
     accounting-policy 5
     shared-address 0

Because the fields separator FS is set to \n, the first field ($1) is equal to the first line of such a multiline record..
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

Match Strings between two files, print portions of each file together when matched ([g]awk)

I have two files and desire to use the strings from $1 of file 1 (file1.txt) as search criteria to find matches in $2 of file 2 (file2.txt). If matches are found I want to output the entire line of file 2 (file2.txt) followed by fields $2-$11 of file 1 (file1.txt). I can find the matches, I cannot... (7 Replies)
Discussion started by: jvoot
7 Replies

2. Shell Programming and Scripting

awk to print missing and keep sequential ordering if not found

The below awk in bold will look for the ids in file1 in $2 of file2 and if they match print the line in file2. If an id is missing or not found in file2 (like BMPR2 in line4 of file1) I can not figure out how to add it to them to the lines in the output as missing in $3 following the same format.... (4 Replies)
Discussion started by: cmccabe
4 Replies

3. UNIX for Beginners Questions & Answers

How to use awk to print strings with anchors?

I have a list of countries and I'm trying to print the country names that start with "A" and end in "a". I can do the first one which gives me the correct output. awk '/^A/ {print $1}' countries.txt but when I try: awk '/^A a$/ {print $1}' countries.txt or even: awk... (2 Replies)
Discussion started by: steezuschrist96
2 Replies

4. Shell Programming and Scripting

Print strings that match pattern with awk

I have a file with many lines which contain strings like .. etc. But with no rule regarding field separators or anything else. I want to print ONLY THE STRING from each line , not the entire line !!! For example from the lines : Flow on service executed with success in . Performances... (5 Replies)
Discussion started by: black_fender
5 Replies

5. Shell Programming and Scripting

awk to loop lines and print substring

The input data: mbeanName: com.sap.default:name=tc~bl~deploy_controller,j2eeType=SAP_J2EEServicePerNode,SAP_J2EEClusterNode=3620850,SAP_J2EECluster=XXX Get attribute Properties: {undepl_parallelism_strategy=normal, deployment_forbidden=off, locking_retries=50, suppress_ds_warnings=on,... (5 Replies)
Discussion started by: ux4me
5 Replies

6. Shell Programming and Scripting

Print lines between two strings multiple occurencies (with sed, awk, or grep)

Hello, I can extract lines in a file, between two strings but only one time. If there are multiple occurencies, my command show only one block. Example, monfichier.txt contains : debut_sect texte L1 texte L2 texte L3 texte L4 fin_sect donnees inutiles 1 donnees inutiles 2 ... (8 Replies)
Discussion started by: theclem35
8 Replies

7. Shell Programming and Scripting

awk strings search + print next column after match

Hi, I have a file filled with search strings which have a blank in between and look like this: S. g. Ehr. o. Jg. v. d. Chijs g. Ehr. Now i would like to search for the strings and it also shall return the next column after the match. awk -v FILE="search_strings.txt" 'BEGIN {... (10 Replies)
Discussion started by: sdf
10 Replies

8. Shell Programming and Scripting

Compare strings between 2 arrays and print number in AWK

Hi to everyone, Please some help over here. Hi have array a with 6 elements and array b with 3 elements as shown inside BEGIN{} statement. I need help to get the correct sintax (the part in red) to compare if string from array b is in array a and print the number related for each match.... (3 Replies)
Discussion started by: Ophiuchus
3 Replies

9. Shell Programming and Scripting

perl or awk print strings between words

hi everyone, 1.txt 981 I field1 > field2.a: aa, ..si01To:<f:a@a.com>From: <f:a@a.com>;tag=DVNgfRZBZRMi96 <f:a@1:333>;ZZZZZ: 12345 the output field1 field2 <f:a@a.com> the output is cut the string 3rd and 5th field, and get the value betwee "To:" and "From:", please advice. ... (1 Reply)
Discussion started by: jimmy_y
1 Replies

10. Shell Programming and Scripting

How to print only lines in between two strings using awk

Hi, I want to print only lines in between two strings and not the strings using awk. Eg: OUTPUT top 2 bottom 1 left 0 right 0 page 66 END I want to print into a new file only top 2 bottom 1 left 0... (4 Replies)
Discussion started by: jisha
4 Replies
Login or Register to Ask a Question