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
# 8  
Old 04-04-2014
Code:
awk '$0 !~ /filter-shared 14/ && $1 ~ /move-group/ {print (RS $1)}' FS='\n' RS='interface'  file

# 9  
Old 04-04-2014
Note: Using a regular expression instead of a single character with RS is an extension supported only by gawk and mawk..
# 10  
Old 04-04-2014
Scrutinizer,
Your awk line works very well, thank you. I was using a test file for it first but when using it on the actual files, it worked out fine.
Thanks again!
# 11  
Old 04-04-2014
Hi.

This longish post is intended to show a general technique for working with paragraphs or stanzas of data. Each stanza is transformed so that a copy of it becomes a single, standard text line, embedded newlines are converted to some other character (in the specific case "|"). This creates an intermediate structure that one could call a super-line.

The super-lines are then manipulated to obtain a final set of super-lines that conform to the requirements. Finally, the super-lines are split back to normal, and final filtering can be done.

This script performs that combination of operations. The creation of super-lines can be done with awk, perl, etc. I used a perl utility from github called cat0par (see script for link). The script also uses a few local tools such pll, specimen, etc.
Code:
#!/usr/bin/env bash

# @(#) s1	Demonstrate join / split of super-line to search embedded string.
# See:
# https://github.com/jakobi/script-archive/blob/master/cli.list.grep/cat0par
# or:
# https://raw.githubusercontent.com/jakobi/script-archive/master/cli.list.grep/cat0par

# Utility functions: print-as-echo, print-line-with-visual-space, debug.
# export PATH="/usr/local/bin:/usr/bin:/bin"
LC_ALL=C ; LANG=C ; export LC_ALL LANG
pe() { for _i;do printf "%s" "$_i";done; printf "\n"; }
pl() { pe;pe "-----" ;pe "$*"; }
db() { ( printf " db, ";for _i;do printf "%s" "$_i";done;printf "\n" ) >&2 ; }
db() { : ; }
pe
what $( which pll cat0par )
C=$HOME/bin/context && [ -f $C ] && $C specimen cat0par grep sed pll

FILE=${1-data1}

pl " Sample input data file $FILE:"
specimen 5 $FILE

# Collect and join all lines in an "interface" stanza into a super-line.
# Select "move-group: super-lines.
# Omit "filter-shared 14" super-lines.
# Split super-lines back into stanzas.
# Select "interface" lines.

rm -f f[1-9]
pl " Results:"
cat0par -nl -nonl='|' -start "interface" $FILE |
tee f1 |
grep "move-group" |
tee f2 |
grep -v "filter-shared 14" |
tee f3 |
sed 's/|/\n/'g |
tee f4 |
grep "interface"

pl " Content of intermediate files:"
pll f?

exit 0

producing:
Code:
$ ./s1

pll	Print long-line, section, trim, shorten to width as necessary.
cat0par	Combine/split lines to stanza/groups/superlines.

Environment: LC_ALL = C, LANG = C
(Versions displayed with local utility "version")
OS, ker|rel, machine: Linux, 2.6.26-2-amd64, x86_64
Distribution        : Debian 5.0.8 (lenny, workstation) 
bash GNU bash 3.2.39
specimen (local) 1.17
cat0par (local) 1.3
grep GNU grep 2.5.3
sed GNU sed version 4.1.5
pll (local) 1.22

-----
 Sample input data file data1:
Edges: 5:0:5 of 27 lines in file "data1"
interface 1/1/1/0 move-group
     decription one one one zero
     no shut
     filter-shared 14
     accounting-policy 5
   ---
interface 1/1/1/4 permanent-group
     decription one one one four
     no shut
     accounting-policy 5
     shared-address 0

-----
 Results:
interface 1/1/1/1 move-group
interface 1/1/1/3 move-group

-----
 Content of intermediate files:
 (Longest line: 143; fit into lines of length 78)
         1         2         3     ...     11        12        13        
12345678901234567890123456789012345...78901234567890123456789012345678901
FILE = f1
interface 1/1/1/0 move-group|     d...unting-policy 5|     shared-address
interface 1/1/1/1 move-group|     d...unting-policy 5|     shared-address
interface 1/1/1/2 move-group|     d...unting-policy 5|     shared-address
interface 1/1/1/3 move-group|     d...unting-policy 5|     shared-address
interface 1/1/1/4 permanent-group| ...unting-policy 5|     shared-address

FILE = f2
interface 1/1/1/0 move-group|     d...unting-policy 5|     shared-address
interface 1/1/1/1 move-group|     d...unting-policy 5|     shared-address
interface 1/1/1/2 move-group|     d...unting-policy 5|     shared-address
interface 1/1/1/3 move-group|     d...unting-policy 5|     shared-address

FILE = f3
interface 1/1/1/1 move-group|     d...unting-policy 5|     shared-address
interface 1/1/1/3 move-group|     d...unting-policy 5|     shared-address

FILE = f4
interface 1/1/1/1 move-group
     decription one one one one
     no shut
     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

The intermediate files are displayed to show the progress of the operation. They can be omitted for production work.

Best wishes ... cheers, drl
This User Gave Thanks to drl For This Post:
# 12  
Old 04-04-2014
Relatively easy in sed:
Code:
sed -n '
    :loop
    N
    /\ninterface/!{
        $!{
            s/\n/:/
            b loop
            }
        s/$/\
/
        }
    /filter-shared 14/!{
        s/:.*\n/\
/
        P
        }
    s/.*\n//
    b loop
' file

Narrative: Set a branch tag 'loop' for looping, add another input line to the buffer, if the final line in the buffer is not an interface line then if it is not EOF then turn the linefeed into a colon and go back to loop else for EOF put a linefeed on the end of the line, then if there is no key string in the buffer, remove all but the interface lines and print the first interface line, discard the first line(s) in the buffer and loop back for more lines.
This User Gave Thanks to DGPickett For This Post:
# 13  
Old 04-04-2014
Hi, DGPickett.

Your sed code, sed GNU sed version 4.1.5, results in:
Code:
interface 1/1/1/1 move-group
interface 1/1/1/3 move-group
interface 1/1/1/4 permanent-group

Best wishes ... cheers, drl
# 14  
Old 04-07-2014
One more issue came up, I need to print the interface lines that match and also the next line after the interface.

I have this awk statement, but I can't get the line after, the description line to print.
Code:
nawk 'END {if (!ok) print r} /interface/ && /move-group/ {if (!ok) print r; r = $0; ok = x}/filter-shared 14/ {r = r RS $0; ok++}' inputfile
interface 1/1/1/1 move-group
interface 1/1/1/3 move-group

I need it to say
Code:
interface 1/1/1/1 move-group
     decription one one one one
 
interface 1/1/1/3 move-group
      description one one one three

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