Formatting grep and awk output


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Formatting grep and awk output
# 1  
Old 06-27-2013
Formatting grep and awk output

Hi there. I have a very large file and I am trying to format it so that I can pull out certain pieces of data/info and report it in spreadsheet format/style.

The file has ###### which will separate each line that will be listed in the spreadsheet. Whenever I find "No" at the end of a line I want to be able to print info from the previous lines before finding the No. I want to be able to print second and third entry on the line previous lines with the "=" and then the Director Identification, the Director Port all on one line in a spreadsheet format.

I'm sure this can be done using awk programming but I am really struggling to find the correct syntax to use. My main problem has to do with pulling data that is ahead of finding the "No". You will see that in my extract below that in the first set of data between the ##### that the No appears on the last line so the Director Identification and Port will be the ones just above that No where as in the next set of data the No is not the last line....

For example in the extract from the file below I want the output to be

Code:
SEIDBABAK01_212E4_VMAX2673 10000000c93212e4 FA13e1 FA-8F 0 
POST07_HBA_1_VMAX2673_FA_5F1 10000000c93d51d7 FA-5E 0



Below is the extract from the file...

Code:
="SEIDBABAK01",="SEIDBABAK01_212E4_VMAX2673_FA13e1",="10000000c93212e4",="SEI_FABRIC_1_BOTTOM",="Switch_9"

Symmetrix ID            : 000192602673

Director Identification : FA-13E
Director Port           : 1

                            User-generated                      Logged On
Identifier       Type  Node Name        Port Name        FCID   In     Fabric
---------------- ----- --------------------------------- ------ ------ ------
10000000c93212e4 Fibre 10000000c93212e4 10000000c93212e4 618180 Yes    Yes

Director Identification : FA-8F
Director Port           : 0

                            User-generated                      Logged On
Identifier       Type  Node Name        Port Name        FCID   In     Fabric
---------------- ----- --------------------------------- ------ ------ ------
10000000c93212e4 Fibre 10000000c93212e4 10000000c93212e4 618180 No     No

####################################################



BLANK,="POST07_HBA_1_VMAX2673_FA_5F1",="10000000c93d51d7",="SEI_FABRIC_2_TOP",="Switch_10"

Symmetrix ID            : 000192602673

Director Identification : FA-5E
Director Port           : 0

                            User-generated                      Logged On
Identifier       Type  Node Name        Port Name        FCID   In     Fabric
---------------- ----- --------------------------------- ------ ------ ------
10000000c93d51d7 Fibre 10000000c93d51d7 10000000c93d51d7 680913 No     No

Director Identification : FA-5F
Director Port           : 1

                            User-generated                      Logged On
Identifier       Type  Node Name        Port Name        FCID   In     Fabric
---------------- ----- --------------------------------- ------ ------ ------
10000000c93d51d7 Fibre 10000000c93d51d7 10000000c93d51d7 680913 No     Yes

####################################################

Moderator's Comments:
Mod Comment Please use CODE tags when posting desired output as well as sample intput and code. QUOTE tags hide spacing details and should not be used for posting code and I/O samples.

Last edited by Don Cragun; 06-28-2013 at 08:28 AM.. Reason: CODE tags
# 2  
Old 06-27-2013
what have you tried in awk? If you can post that we can try to correct it..
# 3  
Old 06-27-2013
Yes: post what you've tried so far. And, how does that FA13e1end up in your sample output?
# 4  
Old 06-28-2013
Thanks guys for your replies.

I need to simplify this a bit I think. What I am really trying to do is print information from the lines above when "No" is matched as the 6th entry in the line that has "Fibre" in it. So when No is matched on $6 I want to print the

Code:
Director Identification : FA-8F
Director Port           : 0

Where the line that contains the word "Fibre" looks like

Code:
10000000c93212e4 Fibre 10000000c93212e4 10000000c93212e4 618180 No     No


So from the extract of the file that I posted I can easily filter out the "Fibre" and "No" using something like the following command

Code:
cat <filename> | awk '/\=|Director Identification|Director Port|Fibre/ {print $0}' |  awk '{ if (NF ==7 && $6=="No") print$1}'

which prints $1 from that line and obviously I can print anything I want from that line. But when I get a "No" in $6 I want to be able to print the

Code:
Director Identification : FA-8F
Director Port           : 0

from the lines just above the line with the "No".

I am really just struggling with trying to filter out data that is in lines above the matched text with "No" in $6.

Once I filer it out I won't have a problem with formatting the output the way I want it.

---------- Post updated at 05:34 PM ---------- Previous update was at 11:59 AM ----------

I have figured out a way around this. I reformatted the file so that I could filter out what I need. It gives me what I need for now. I would still like to know a way to print previous lines in a file when a field entry is matched on a later line. Anyway this is the awk code I used. Not very pretty but it works...

Code:
cat 2673_nologin_check.out | sed '/\#/d' | sed '/User-generated/d' | sed '/Symmetrix ID/d' | sed '/FCID/d' | sed '/\-\-\-/d' | sed '/^$/d' | sed '/\=\"/d' | sed 's/Director Identification \: //g' | sed 's/Director Port           \://g' | sed '/^$/d' | nawk '{ORS=NR%3?FS:RS}{print$0}' | awk '/No$/ {print$1,$2,$3}'

Which generates output like


Code:
FA-8F 0 10000000c93212e4
FA-5E 0 10000000c93d51d7
FA-8E 0 10000000c93d543c
FA-8F 0 10000000c940c25f
FA-10H 0 10000000c940c704
FA-5F 0 10000000c940d225
FA-6G 0 10000000c9418749


Last edited by Don Cragun; 06-28-2013 at 08:23 AM.. Reason: Use CODE tags; not QUOTE tags for code and I/O samples
# 5  
Old 06-28-2013
Code:
awk -F"[, ]" '$0!~/./{next}/,/{gsub(/[="]*/,z);x=$2 OFS $3}/r Id|r Po/&&x{x=x OFS $NF}$NF=="No"{print x;x=z}'  yourfile

Make sure it fits with your expectations, or feel free to adjust to your requirements.
What i get is like :

Code:
$ cat tst
="SEIDBABAK01",="SEIDBABAK01_212E4_VMAX2673_FA13e1",="10000000c93212e4",="SEI_FABRIC_1_BOTTOM",="Switch_9"

Symmetrix ID            : 000192602673

Director Identification : FA-13E
Director Port           : 1

                            User-generated                      Logged On
Identifier       Type  Node Name        Port Name        FCID   In     Fabric
---------------- ----- --------------------------------- ------ ------ ------
10000000c93212e4 Fibre 10000000c93212e4 10000000c93212e4 618180 Yes    Yes

Director Identification : FA-8F
Director Port           : 0

                            User-generated                      Logged On
Identifier       Type  Node Name        Port Name        FCID   In     Fabric
---------------- ----- --------------------------------- ------ ------ ------
10000000c93212e4 Fibre 10000000c93212e4 10000000c93212e4 618180 No     No

####################################################



BLANK,="POST07_HBA_1_VMAX2673_FA_5F1",="10000000c93d51d7",="SEI_FABRIC_2_TOP",="Switch_10"

Symmetrix ID            : 000192602673

Director Identification : FA-5E
Director Port           : 0

                            User-generated                      Logged On
Identifier       Type  Node Name        Port Name        FCID   In     Fabric
---------------- ----- --------------------------------- ------ ------ ------
10000000c93d51d7 Fibre 10000000c93d51d7 10000000c93d51d7 680913 No     No

Director Identification : FA-5F
Director Port           : 1

                            User-generated                      Logged On
Identifier       Type  Node Name        Port Name        FCID   In     Fabric
---------------- ----- --------------------------------- ------ ------ ------
10000000c93d51d7 Fibre 10000000c93d51d7 10000000c93d51d7 680913 No     Yes

####################################################
$ awk -F"[, ]" '$0!~/./{next}/,/{gsub(/[="]*/,z);x=$2 OFS $3}/r Id|r Po/&&x{x=x OFS $NF}$NF=="No"{print x;x=z}' tst
SEIDBABAK01_212E4_VMAX2673_FA13e1 10000000c93212e4 FA-13E 1 FA-8F 0
POST07_HBA_1_VMAX2673_FA_5F1 10000000c93d51d7 FA-5E 0
$

Note that :
a) the code does not print to the last "No" before the #### but
until it meet the first "No"
b) you can also enforce the code by adding a cleanup condition of x variable like /####/{x=z}

Code:
$ awk -F"[, ]" '$0!~/./{next}/,/{gsub(/[="]*/,z);x=$2 OFS $3}/r Id|r Po/&&x{x=x (/r Po/?":":OFS) $NF}$NF=="No"{print x;x=z}' tst
SEIDBABAK01_212E4_VMAX2673_FA13e1 10000000c93212e4 FA-13E:1 FA-8F:0
POST07_HBA_1_VMAX2673_FA_5F1 10000000c93d51d7 FA-5E:0


Last edited by ctsgnb; 06-28-2013 at 03:27 PM..
# 6  
Old 06-28-2013
It shouldn't print FA-13E 1, should it? As it is followed by a YES. Try this:
Code:
awk     '!A[1] && NF>0          {m=split ($0, T, "\"")          # save relevant fields
                                 A[1]=T[m-7]
                                 A[2]=T[m-5]}
         /Director Id/          {A[3]=$NF}                      # save Ident
         /Director Po/          {A[4]=$NF}                      # save Port
         /User-gene/            {A[5]=NR+3}                     # get line No. of switch
         NR==A[5] && $NF=="No"  {A[6]=1}                        # save switch info from that line
         /^#+$/ && A[6]         {print A[1],A[2],A[3],A[4]      # print if record end and switch was "No"
                                 delete A}                      # clear the info retained; new record
        '  file
SEIDBABAK01_212E4_VMAX2673_FA13e1 10000000c93212e4 FA-8F 0
POST07_HBA_1_VMAX2673_FA_5F1 10000000c93d51d7 FA-5F 1

# 7  
Old 06-28-2013
If FA-13E 1 is not expected you can give a try to

Code:
$ awk -F"[, ]" '$0!~/./{next}/,/{gsub(/[="]*/,z);x=$2 OFS $3}/r Id|r Po/{y=y (/r Po/?":":OFS) $NF}$NF=="No"{print x y;x=z}/Fibre/{y=z}' tst
SEIDBABAK01_212E4_VMAX2673_FA13e1 10000000c93212e4 FA-8F:0
POST07_HBA_1_VMAX2673_FA_5F1 10000000c93d51d7 FA-5E:0

Code:
$ awk -F"[, ]" '$0!~/./{next}/,/{gsub(/[="]*/,z);x=$2 OFS $3}/r Id|r Po/{y=y OFS $NF}$NF=="No"{print x y;x=z}/Fibre/{y=z}' tst
SEIDBABAK01_212E4_VMAX2673_FA13e1 10000000c93212e4 FA-8F 0
POST07_HBA_1_VMAX2673_FA_5F1 10000000c93d51d7 FA-5E 0
$

Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Problem in formatting output in sed / awk

I have a file like this : ! 1 ! 542255 ! 50,140.00 ! ! 2 ! 551717 ! 5,805.00 ! ! 3 ! 551763 ! 8,130.00 ! ! 4 ! 551779 ! 750.00 ! ! 5 ! 551810 ! 56,580.00 ! ! 6 ! 551816 ! 1,350.00 ! ! 7 ! 551876 ! 360.00 ! ! 8 ! 551898 ! ... (10 Replies)
Discussion started by: adam1969in
10 Replies

2. Shell Programming and Scripting

Grep output to awk command

Hi Team(Solaris 5.8/Ksh), How can we save grep output to awk variable when grep returns more than one line or word. abc.log # more abc.log Hi Makarand How r u bye Makarand Hello when grep returns only 1 word below command works nawk -v var=`cat abc.log |grep "Hello"` 'BEGIN { if... (6 Replies)
Discussion started by: Makarand Dodmis
6 Replies

3. Shell Programming and Scripting

awk Script Output in Outlook Formatting Issue

When i execute the below shell script with 2 different Input files, for one of the data files (datafile1) my email message body in the outlook messes up and every thing comes up in one line. May i please know what i am doing wrong here or how to fix this? The only difference in data files is one is... (1 Reply)
Discussion started by: Ariean
1 Replies

4. Shell Programming and Scripting

awk - grep particular word from output

Hi Experts, - Getting error while using it through a variable to get the PID, PID=42 # UNIX95=1 ps -e -o pcpu,pid,ppid,stime,etime,args | awk '{if ($2~"^42$") print $0}' 0.00 42 0 Feb 10 600-17:21:29 nfs_async_io - But when using with a variable it is not working . #... (6 Replies)
Discussion started by: rveri
6 Replies

5. Shell Programming and Scripting

awk or grep to search one column and output the other

Hello, it would be great if someone can help me with the following: I want to search for the rows from fileA in column 1 of fileB and output column 2 of fileB if found in fileC. In the moment I search within the complete file. How can I change the code so only column 1 is searched? cat fileA... (7 Replies)
Discussion started by: Manyaka
7 Replies

6. Shell Programming and Scripting

Formatting output using awk in ksh

:oi was trying to write a script to format output of a command in ksh which has output as below: so i used : to get which i require at all times. But problem occurs when status part changes. above output i get when status is SU (success).If the status is IN (inactive), output of... (1 Reply)
Discussion started by: pr5439
1 Replies

7. Shell Programming and Scripting

Formatting of output from awk

Hi; i m running an command like; getfacl $(find /home/fstl/testShell/ -type f -ls | awk '{print $11}') and i m getting outpiut for all files in "testShell" folder as; # file: home/fstl/testShell/.script1.sh.swp # owner: root # group: root user:fstl:rw- user:ajay:rw- group:root:r--... (1 Reply)
Discussion started by: ajaypadvi
1 Replies

8. Shell Programming and Scripting

output formatting with awk.

# echo $PATH /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin How would i write a script to display permission on each folders in $PATH variable below format. drwxr-xr-x 2 0 root 4096 Nov 24 14:51 /usr/kerberos/sbin drwxr-xr-x 2 0... (2 Replies)
Discussion started by: pinga123
2 Replies

9. Shell Programming and Scripting

Output formatting of grep

hi, I am trying to find the word "root" from the follwoing sample file: #12.12.12.2222 echo "Hai........" 11.11.1.1111 3.23.AS.AA ab.cd.df.rf /usr/bin jhhh 12.12.AF.12 /urf/sss/kk kkk su sh.s exec su root; ,root sudo -sh cosrootex (3 Replies)
Discussion started by: flamingo_l
3 Replies

10. Shell Programming and Scripting

Question about formatting output using AWK

Hi everyone. I've got this fille... 0 5000001 5000002 5000003 5000006 5000007 5000219 11000156 11003130 11003132and this script... #!/bin/ksh FILE_ALERT_CONTACT_LIST=users.txt userID=`awk -F"=" '{printf $1 ", "}' $FILE_ALERT_CONTACT_LIST` (9 Replies)
Discussion started by: Fatbob
9 Replies
Login or Register to Ask a Question