grep - Extracting multiple key words from stdout

Hello.

From command line, the command zypper info nxclient
return a bloc of data :

linux local # zypper info nxclient
Loading repository data...
Reading installed packages...


Information for package nxclient:

Repository: zypper_local
Name: nxclient
Version: 3.5.0-7
Arch: x86_64
Vendor: NoMachine
Installed: No
Status: not installed
Installed Size: 10.3 MiB
Summary: NX Client
Description: 
NoMachine NX is a fast and scalable terminal server system based on the
X11 protocol. NX lets you work fluently even across slow links like modems
and provides a full set of administration tools that make it a complete
desktop virtualization solution for your organization.

This package contains the graphical front-end used to access X, RDP and RFB
sessions on a remote NX Server. It also includes NX X compression libraries
and utilities needed by both NX Client and Server.

Baseline:

nx-X11: 3.5.0-1
nxauth: 3.5.0-1
nxwin:  3.5.0-2
nxssh:  3.5.0-2
nxcomp: 3.5.0-2
nxesd:  3.5.0-2
nxkill: 3.5.0-1
nxservice: 3.5.0-2
nxcompsh: 3.5.0-1
nx-X11-compat: 3.5.0-1
linux-srv:/local/install_from_local #

How to code a function which return true if the bloc of data contains some specific values.

something like :

#!/bin/bash
#

function my_filter() {

if Repository = zypper_local thenif Installed = No then
if Status = not installed then
my_filter = "TRUE"
fi
fi
fi
}

#MAIN

zypper info nxclient > file_temp.text

if my_filter(file_temp.txt) = true theninstall it
fi

# end

I look for a better solution that reading "file_temp.text" 3 times and looking for each parameter :

result=${ command | grep para1 para2 para3 )
if $result=true then
     install
fi
cnt=$(zypper info nxclient | grep -c -e 'Repository zypper_local'  -e 'Installed: no' -e 'Status = not installed')
if [ $cnt -eq 3 ] ; then
  # do something
fi
1 Like

Great

Thank you very much.

:slight_smile:

I get headache with quote.

Here's exposure problem :

In the following :
Note 1 :
file_to_grep_in is the result of the zypper command issue in the current running bash script
like :

zypper  zypper_option package_to_install > file_to_grep_in

To use the grep function in a BASH program, I modify the command as follows:

cnt=$( grep -c -e grep_param_1 -e grep_param_2   -e ..... -e ........   file_to_grep_in )

and to follow the script I print result on the console I used to use

CMD="all command and parameters stuff"
 echo "command : $CMD"
 $CMD

Which gives

CMD="cnt=$( grep -c -e grep_param_1  -e grep_param_2    -e grep_param_3   file_to_grep_in )"
echo "command : $CMD"
$CMD

Note 2 :
Each of the parameters used by grep consist of two or three parts. Each party being represented by a variable:
Which gives

CMD="cnt=$( grep -c -e $grep_param_1_part1 $grep_param_1_part2   -e $grep_param_2_part1 $grep_param_2_part2   -e $grep_param_3_part1 $grep_param_3_part2   $grep_param_3_part3   $file_to_grep_in )"
echo "command : $CMD"
$CMD

How to obtain this
I show the printout I want to get for the script command : echo "command : $CMD" and the variab le CMD contain : CNT=$(.................)

CNT=$(grep -c -e "Non-option program arguments: 'nxclient' "  -e "Selecting  'nxclient-" -e  "from repository 'nxclient' for installation"  /tmp/nxclient_install.log )

Remark 1 first parameter : see at the end nxclient between single quote --> 'nxclient'
Remark 2 second parameter : see at the end nxclient with single quote and dash --> 'nxclient-
Remark 1 third parameter : see in the middle nxclient between single quote --> 'nxclient'

$grep_param_1_part1 = Non-option program arguments: '
$grep_param_1_part2 = nxclient'
$grep_param_2_part1 = Selecting '
$grep_param_2_part2 = nxclient-
$grep_param_3_part1 = from repository '
$grep_param_3_part2 = nxclient
$grep_param_3_part3 = ' for installation
$file_to_grep_in = /tmp/nxclient_install.log

By the way is it possible to add parameter 4 with this constraint :

Look for

param_4_part_1 = >The following NEW package is going to be installed:<
at the very beginning at the next line 
param_4_part_2 = >nxclient<

Hi.

Command agrep allows simple forms for AND ( ; ), as well as OR (, ), as shown here:

#!/usr/bin/env bash

# @(#) s1	Demonstrate searching for either-or patterns, agrep.

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() { : ; }
C=$HOME/bin/context && [ -f $C ] && $C agrep

FILE=${1-data1}
# Omit if specimen not found:
pl " Sample of input file $FILE:"
specimen $FILE

pl " Results with agrep:"
agrep 'Repository: zypper_local,Installed: No,Status: not installed' $FILE

exit 0

producing:

% ./s1

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 GNU/Linux 5.0.8 (lenny) 
bash GNU bash 3.2.39
agrep - ( /usr/bin/agrep, 2007-02-07 )

-----
 Sample of input file data1:
Edges: 5:0:5 of 38 lines in file "data1"
Loading repository data...
Reading installed packages...


Information for package nxclient:
   ---
nxkill: 3.5.0-1
nxservice: 3.5.0-2
nxcompsh: 3.5.0-1
nx-X11-compat: 3.5.0-1


-----
 Results with agrep:
Repository: zypper_local
Installed: No
Status: not installed

And agrep is found in repository:

% zypper info agrep
Loading repository data...
Reading installed packages...


Information for package agrep:

Repository: openSUSE-11.4-Oss
Name: agrep
Version: 0.8.0-6.1
Arch: x86_64
Vendor: openSUSE
...

Best wishes ... cheers, drl

1 Like

My problem is not to find some substring within a file; as jim mcnamara give me a solution.
My (new)problem is to find substring which contain single quote within the file. And to print to the screen what is to be being done.

Making some try, I can print the variable CMD which show on screen the good code to be executed:

.......
.......
.......
echo "COMMAND : $CMD"

Show :

COMMAND : CNT=$(  grep -c -e  "Non-option program arguments: 'nxclient'" -e   "Checking whether to refresh metadata for zypper_local"  -e  "Selecting 'nxclient-3.5.0-7.x86_64' from repository 'zypper_local' for installation."  /tmp/nxclient_install_log.txt )

Which is correct; and should give CNT=3 which is correct.
But when I try to execute $CMD I get this error :

/root/bin/freenx_install_server_function: line 102: CNT=$(: command not found

How to execute $CMD with success.

Hi.

Much of the text was from the initial problem, but this is a separate issue.

Thank you for clarifying it for me. I suggest you begin a new thread for a new problem ... cheers, drl

1 Like

Hello.
Following your recommendation would you see : Variable indirection

This thread is closed.

Thank you to every body