Script to process file from a directory and grep the required content and print


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Script to process file from a directory and grep the required content and print
# 1  
Old 02-06-2013
Script to process file from a directory and grep the required content and print

Hi All,
below script reads the perticular files from the directory. Am trying to fetch status and print them in the required format.
It needs to read line and search for string "Passed/Failed" and print them under correct sub header.

script :
Code:
 
BASE_DIR=/tmp/test/REPORT/CollectReport
# report header.
echo
echo "Server              Interface Checks                  Process Checks          Service Check"
echo "              VerifyInterface  Corefile      VerifyRegister VerifyComponent                "
echo "-------      ----------------  ---------     -------------  -------------     -------------"
#cd $BASE_DIR
 
for file in *_Daily_Check*
    do
      if [ -f "$file" ];then
       awk -F":" '/[Pp]assed/{print $3 $1 FS}' "$file"
       awk -F":" '/[Ff]ailed/{print $3 $1 FS}' "$file"
       echo "$file"
      fi
    done

Code:
 
Input file looks like
Code:
root@bbt #  cat D01B_Daily_Check.log
 
1.Interface checking
 
Passed:VerifyInterface:D01B : All interface cards are up
 
Passed:CoreFileGenerated:D01B : There is no core dump file.
 
2.Process checking
 
        Passed:VerifyRegister:D01B : All products have been REGISTERED
 
        Failed:VerifyComponent:D01B : Some Component Not RUNNING.  dbt 0/1 :
 
3.Checking Service available
 
Failed:VerifyServiceAvailability:D01B: Service PERM_DRV is NOT up.
 
root@bbt #  cat E01A_Daily_Check.log
 
1.Interface checking
 
Failed:VerifyInterface:E01A : All interface cards are down
 
Passed:CoreFileGenerated:E01A : There is no core dump file.
 
2.Process checking
 
        Failed:VerifyRegister:E01A : Not all products have been REGISTERED yet
 
        Failed:VerifyComponent:E01A : Some Component Not RUNNING.  dbt 0/1 :
 
3.Checking Service available
 
Failed:VerifyServiceAvailability:E01A: Service PERM_DRV is NOT up.
 
root@bbt #
output required :
Code:
Server              Interface Checks                  Process Checks          Service Check
              VerifyInterface  Corefile      VerifyRegister VerifyComponent                
-------      ----------------  ---------     -------------  -------------     -------------
D01B   Passed   Passed   Passed   Failed   Failed
E01A   Failed   Passed   Failed   Failed   Failed
output now getting like this : root@btt # ./output.sh Server Interface Checks Process Checks Service Check VerifyInterface Corefile VerifyRegister VerifyComponent ------- ---------------- --------- ------------- ------------- ------------- D01B Passed: D01B Passed: D01B Passed: D01B Failed: D01BFailed: D01B_Daily_Check.log E01A Failed: E01A Passed: E01A Failed: E01A Failed: E01AFailed: E01A_Daily_Check.log

# 2  
Old 02-06-2013
Code:
echo
echo "Server              Interface Checks                  Process Checks          Service Check"
echo "              VerifyInterface  Corefile      VerifyRegister VerifyComponent                "
echo "-------      ----------------  ---------     -------------  -------------     -------------"

for file in *_Daily_Check*
do
        server=${file%%_*}
        if [ -f "$file" ]
        then
                awk -F":" -v S="$server" '/VerifyInterface/ {
                        printf "%s%20s", S, $1;
                } /CoreFileGenerated/ {
                        printf "%15s", $1;
                } /VerifyRegister/ {
                        printf "%15s", $1;
                } /VerifyComponent/ {
                        printf "%15s", $1;
                } /VerifyServiceAvailability/ {
                        printf "%15s\n", $1;
                } ' "$file"
        fi
done

This User Gave Thanks to Yoda For This Post:
# 3  
Old 02-07-2013
Thanks bipinajith. It works perfectly.
Can you please tell me how to check for string Passed/Failed and color the string based on condition. ie,
if s/$1 ==Passed, then string color should be in Green otherwise Red.
I tried something but didn't work, all the text comes in green color.
Code:
for file in *_Daily_Check*
do
        server=${file%%_*}
        if [ -f "$file" ]
        then
                nawk -F":" -v S="$server" '/VerifyInterface/ {
    
    
#printf "|%s%20s", S, $1;if ($1 == "Passed"){$1 = "\033[1;32m" s "\033[0m" };if (s == "Failed"){$1 = "\033[1;31m" s "\033[0m"}
 
 
 
printf "\033[1;32m|%s%20s\033[0m", S, $1;if (s == "Passed"){$1 = "\033[1;32m" s "\033[0m" };
                } /CoreFileGenerated/ {
                        printf "\033[1;32m%15s\033[0m", $1;
                } /VerifyRegister/ {
                        printf "\033[1;32m%15s\033[0m", $1;
                } /VerifyComponent/ {
                        printf "\033[1;32m%15s\033[0m", $1;
                } /VerifyServiceAvailability/ {
                        printf "\033[1;32m%15s\033[0m|\n", $1;
                } ' "$file"
           echo "|--------------------------------------------------------------------------------------------------------|"
        fi
done
}

# 4  
Old 02-07-2013
Code:
for file in *_Daily_Check*
do
        server=${file%%_*}
        if [ -f "$file" ]
        then
                awk -F":" -v S="$server" '/VerifyInterface/ {
                        if($1=="Passed") s="\033[1;32m" $1 "\033[0m";
                        if($1=="Failed") s="\033[1;31m" $1 "\033[0m";
                        printf "%s\t\t%s", S, s;
                } /CoreFileGenerated/ {
                        if($1=="Passed") s="\033[1;32m" $1 "\033[0m";
                        if($1=="Failed") s="\033[1;31m" $1 "\033[0m";
                        printf "\t\t%s", s;
                } /VerifyRegister/ {
                        if($1=="Passed") s="\033[1;32m" $1 "\033[0m";
                        if($1=="Failed") s="\033[1;31m" $1 "\033[0m";
                        printf "\t\t%s", s;
                } /VerifyComponent/ {
                        if($1=="Passed") s="\033[1;32m" $1 "\033[0m";
                        if($1=="Failed") s="\033[1;31m" $1 "\033[0m";
                        printf "\t\t%s", s;
                } /VerifyServiceAvailability/ {
                        if($1=="Passed") s="\033[1;32m" $1 "\033[0m";
                        if($1=="Failed") s="\033[1;31m" $1 "\033[0m";
                        printf "\t\t%s\n", s;
                } ' "$file"
        fi
done

# 5  
Old 02-07-2013
bipinajith's code works flawlessly, still it might be affected by the sequence of occurrence of the keywords. If that is certain to remain the same all over, fine. If not, try
Code:
awk 'BEGIN    {CmpAr["VerifyInterface"]=2         # some definitions
               CmpAr["CoreFileGenerated"]=3
               CmpAr["VerifyRegister"]=4
               CmpAr["VerifyComponent"]=5
               CmpAr["VerifyServiceAvailability"]=6
               split ("%-7s %36s %22s %29s %26s %29s", FMT, " ")
               red="\033[1;31m"
               grn="\033[1;32m"
               rst="\033[0m"
               clr["Failed"]=red
               clr["Passed"]=grn
              }
     function prt() {for (i=0; i<=6; i++) printf FMT[i], clr[OutAr[i]] OutAr[i] rst; printf "\n"}

     NR == FNR     {print; next}                  # read & print header

     ($2 in CmpAr) {gsub (" ", "", $1);
                    OutAr[CmpAr[$2]]=$1;          # put $1 into the right column
                    OutAr[1]=$3}                  # save server name

     FILENAME != oldfn {                          # print if old file ends
                   if (oldfn) prt(); oldfn = FILENAME}
     END              {prt()}                     # print when last file ends

    ' FS=":"  header ????_Daily_Check.log 
Server              Interface Checks                  Process Checks          Service Check
              VerifyInterface  Corefile      VerifyRegister VerifyComponent                
-------      ----------------  ---------     -------------  -------------     -------------
D01B                   Passed     Passed            Passed         Failed            Failed
E01A                   Failed     Passed            Failed         Failed            Failed

As you will infer, the header file contains what you need in the first lines of output.
# 6  
Old 02-08-2013
Hi Bipinajith,

I did tried you solution but still not able to get the colors on the string Passed/Failed.

It still shows the string in white color, that means assigning variable s is not working.
I did tried something with printf stmt even that didn't work.

Code:
 for file in *_Daily_Check*
do
        server=${file%%_*}
        if [ -f "$file" ]
        then
                nawk -F":" -v S="$server" '/VerifyInterface/ {
                       #printf "\033[1;36m|%s\033[0m%20s", S, $1;if (s == "Passed"){$1 = "\033[1;32m" s "\033[0m"
                       if($1=="Passed") s="\033[1;32m $1 \033[0m";
                       if($1=="Failed") s="\033[1;31m $1 \033[0m";
        
        #if($1=="Passed") printf "\033[1;32m|%s\033[0m%20s",s,$1;
                       #if($1=="Failed") printf "\033[1;31m|%s\033[0m%20s",s,$1;
        
                       printf "\033[1;36m|%s\033[0m%20s", S, $1;
                } /CoreFileGenerated/ {
                        #printf "\033[1;32m%15s\033[0m", $1;
                        if(s=="Passed"){ $1="\033[1;32m" s "\033[0m";}
                        if(s=="Failed"){ $1="\033[1;31m" s  "\033[0m";}
                        printf "%15s",$1;
      
                       #if($1=="Passed") printf "\033[1;32m|%s\033[0m%20s",s,$1;
                       #if($1=="Failed") printf "\033[1;31m|%s\033[0m%20s",s,$1;
        
                } /VerifyRegister/ {
                        #printf "\033[1;32m%15s\033[0m", $1;
                        if($1=="Passed") s="\033[1;32m" $1 "\033[0m";
                        if($1=="Failed") s="\033[1;31m" $1 "\033[0m";
                        printf "%15s", $1;
                } /VerifyComponent/ {
                        #printf "\033[1;32m%15s\033[0m", $1;
                        if($1=="Passed") s="\033[1;32m" $1 "\033[0m";
                        if($1=="Failed") s="\033[1;31m" $1 "\033[0m";
                        printf "%15s", $1;
                } /VerifyServiceAvailability/ {
                        #printf "\033[1;32m%15s\033[0m     |\n", $1;
                        if($1=="Passed") s="\033[1;32m" $1 "\033[0m";
                        if($1=="Failed") s="\033[1;31m" $1 "\033[0m";
                        printf "%15s     |\n", $1;
                } ' "$file"
           echo "|--------------------------------------------------------------------------------------------------------|"
        fi
done

@RudiC,
Thanks for your solution. It more like making script generic, which is very good. but when i tried to execute
you script, i get the below error which i was not able to resolve :
Error:
Code:
root@bbt # ./output.sh
nawk: can't open file header
 source line number 11

# 7  
Old 02-08-2013
Put
Code:
Server              Interface Checks                  Process Checks          Service Check
              VerifyInterface  Corefile     VerifyRegister VerifyComponent                 
-------      ----------------  ---------     -------------  -------------     -------------

into extra file called "header" and supply as first file to the script. It will print it as is giving you control over what shold appear in the first lines of your output.
Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Directory containing files,Print names of the files in the directory that are exactly same content.

Given a directory containing say a few thousand files, please output a list of all the names of the files in the directory that are exactly the same, i.e. have the same contents. func(a_directory_name) output -> {“matches”: , ... ]} e.g. func(“/home/my/files”) where the directory... (7 Replies)
Discussion started by: anuragpgtgerman
7 Replies

2. Shell Programming and Scripting

Script to search every file in a directory and print last few lines

Hi everyone, I need to write a script to search a directory, output the name of a file to an ouput file and print the last few lines of the files to the output file such that I would have something like this: FILE1: LINE LINE LINE FILE2: LINE LINE LINE FILE3: LINE LINE LINE... (2 Replies)
Discussion started by: mojoman
2 Replies

3. Shell Programming and Scripting

Help required to Print Single quote into a file

Hi, I need help in printing string enclosed with single quotes to a file. I am trying to write a shell script which when run will create another script below is the script logic. cat create_script.sh echo '#!/bin/sh' > append_flname.sh echo 'for FILE in $*' >> append_flname.sh echo... (6 Replies)
Discussion started by: imrandec85
6 Replies

4. Shell Programming and Scripting

How to Modify a file content in UNIX and sort for only required fields ?

I have the below contents in a file after making the below curl call curl ... | grep -E "state|Rno" | paste -sd',\n' | grep "Disconnected" > test "state" : "Disconnected",, "Rno" : "5554f1d2" "state" : "Disconnected",, "Rno" : "10587563" "state" : "Disconnected",, "Rno" :... (2 Replies)
Discussion started by: Vaibhav H
2 Replies

5. Shell Programming and Scripting

Bash script to read a file from particular line till required line and process

Hi All, Am trying to write wrapper shell/bash script on a utility tool for which i need to pass 2 files as arugment to execute utility tool. Wraper script am trying is to do with above metion 2 files. utility tool accepts : a. userinfo file : which contains username b. item file : which... (2 Replies)
Discussion started by: Optimus81
2 Replies

6. Shell Programming and Scripting

Shell script to monitor new file in a directory and mail the file content

Hi I am looking for a help in designing a bash script on linux which can do below:- 1) Look in a specific directory for any new files 2) Mail the content of the new file Appreciate any help Regards Neha (5 Replies)
Discussion started by: neha0785
5 Replies

7. Shell Programming and Scripting

Goto each directory and subdirectories and grep the required pattern

Hi All, I need your help in finding pattern from files present in different directories. I need to search for a pattern "xyz" from "*.txt" files which are present in different levels of directories as shown. example ------- dir1/subdir1/file.txt dir2/subdir2/subsubdir2/file.txt... (5 Replies)
Discussion started by: imas
5 Replies

8. UNIX for Dummies Questions & Answers

Print the content of a directory in jpg file

Is there any possible way to print the contents of a directory to a .jpg file? I have a list of thumbnails (e-books) which I want to share (+500) but I don't know how to make this. I would appreciate a lot any comments regarding this issue. (4 Replies)
Discussion started by: agasamapetilon
4 Replies

9. Shell Programming and Scripting

shell script to search content of file with timestamps in the directory

hello, i want to make a script to search the file contents in my home directory by a given date and output me the line that has the date... (10 Replies)
Discussion started by: psychobeauty
10 Replies
Login or Register to Ask a Question