grep multiple strings and store/print next line values in a variable

Viewed 97

I am trying to grep multiple strings from pom.xml file... for eg below are the contents of the xml file

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.bluesoft.muleesb</groupId>
    <artifactId>Magellan23888Adapter</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>mule-application</packaging>

    <name>Magellan23888Adapter</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <app.runtime>4.3.0</app.runtime>
        <mule.maven.plugin.version>3.3.5</mule.maven.plugin.version>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.mule.tools.maven</groupId>
                <artifactId>mule-maven-plugin</artifactId>
                <version>${mule.maven.plugin.version}</version>
                <extensions>true</extensions>
                <configuration>
                    <sharedLibraries>
                        <sharedLibrary>
                            <groupId>com.ibm.mq</groupId>
                            <artifactId>com.ibm.mq.allclient</artifactId>
                        </sharedLibrary>
                    </sharedLibraries>
                    <classifier>mule-application</classifier>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <distributionManagement>
        <repository>
            <id>releases</id>
            <name>bluesoft releases</name>
            <url>http://nexus.bluesoft.com/repository/releases</url>
        </repository>
        <snapshotRepository>
            <id>snapshots</id>
            <name>bluesoft snapshots</name>
            <url>http://nexus.bluesoft.com/repository/snapshots</url>
        </snapshotRepository>
    </distributionManagement>
    <dependencies>
        <dependency>
            <groupId>com.mulesoft.connectors</groupId>
            <artifactId>mule-x12-connector</artifactId>
            <version>2.6.2</version>
            <classifier>mule-plugin</classifier>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.logging.log4j</groupId>
                    <artifactId>log4j-core</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.logging.log4j</groupId>
                    <artifactId>log4j-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.mule.connectors</groupId>
            <artifactId>mule-objectstore-connector</artifactId>
            <version>1.1.7</version>
            <classifier>mule-plugin</classifier>
        </dependency>
        <dependency>
            <groupId>com.ibm.mq</groupId>
            <artifactId>com.ibm.mq.allclient</artifactId>
            <version>9.2.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.mule.modules</groupId>
            <artifactId>mule-json-module</artifactId>
            <version>2.1.3</version>
            <classifier>mule-plugin</classifier>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.12.0</version>
        </dependency>
        <dependency>
            <groupId>org.mule.connectors</groupId>
            <artifactId>mule-http-connector</artifactId>
            <version>1.5.6</version>
            <classifier>mule-plugin</classifier>
        </dependency>
        <dependency>
            <groupId>org.mule.connectors</groupId>
            <artifactId>mule-file-connector</artifactId>
            <version>1.3.3</version>
            <classifier>mule-plugin</classifier>
        </dependency>
        <dependency>
            <groupId>com.mulesoft.connectors</groupId>
            <artifactId>mule-ibm-mq-connector</artifactId>
            <version>1.6.3</version>
            <classifier>mule-plugin</classifier>
        </dependency>
        <dependency>
            <groupId>org.mule.connectors</groupId>
            <artifactId>mule-sftp-connector</artifactId>
            <version>1.4.0</version>
            <classifier>mule-plugin</classifier>
        </dependency>
        <dependency>
            <groupId>com.mulesoft.modules</groupId>
            <artifactId>mule-secure-configuration-property-module</artifactId>
            <version>1.1.0</version>
            <classifier>mule-plugin</classifier>
        </dependency>
        <dependency>
            <groupId>org.mule.connectors</groupId>
            <artifactId>mule-email-connector</artifactId>
            <version>1.4.1</version>
            <classifier>mule-plugin</classifier>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.16.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.16.0</version>
        </dependency>
    </dependencies>

    <repositories>
        <repository>
            <id>bluesoft-nexus</id>
            <name>bluesoft Nexus</name>
            <url>https://nexus.bluesoft.com/content/groups/public</url>
            <layout>default</layout>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>bluesoft-nexus-plugins</id>
            <name>bluesoft Nexus</name>
            <layout>default</layout>
            <url>https://nexus.bluesoft.com/content/groups/public</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>

</project>

I am trying to run the below command to get the above output from the file

grep -i -A3 'com.mulesoft.connectors\|org.mule.connectors' pom.xml

I want to print the values as below when the above criteria matches, for eg

I am trying to capture all the matched patterns from my below command

grep -i -A3 'com.mulesoft.connectors\|org.mule.connectors' pom.xml 

and from this command i am trying to get artifactId and version

expected output:

artifactId value,version
------------------------
mule-ibm-mq-connector,1.8.3
mule-file-connector,1.5.2
mule-salesforce-connector,10.8.1
mule-email-connector,1.1.8
mule-connector,1.4.1
3 Answers

An XML parser like xmllint suites this task better but you cannot install a new tool for some reason you may consider this grep | gnu-awk solution:

grep -i -A3 'com\.mulesoft\.connectors\|org\.mule\.connectors' pom.xml |
awk -v RS='--' -v OFS=, 'BEGIN {print "artifactId value,version"} 
{gsub(/<\/?[^>]+>/, ""); print $2, $3}'

artifactId value,version
mule-x12-connector,2.6.2
mule-objectstore-connector,1.1.7
mule-http-connector,1.5.6
mule-file-connector,1.3.3
mule-ibm-mq-connector,1.6.3
mule-sftp-connector,1.4.0
mule-email-connector,1.4.1

With your shown samples and attempts please try following Single awk code(Not using grep here and within single awk itself handling the matches, conditions and printing values as per requirement). Written and tested in GNU awk and it uses GNU awk' match function's creating arrays from capturing group values(which are getting created by regex used in solution).

Here is the Online Demo for used regex for understanding purposes, regex creates 3 capturing groups out of which 1st one is getting used for checking condition purposes and rest 2 are getting printed if condition of 1st capturing groups is meeting the OP's condition.

awk -v RS="^$" '
{
  while(match($0,/<groupId>([^<]*)<\/groupId>\n[[:space:]]*<artifactId>([^<]*)\
<\/artifactId>\n[[:space:]]*<version>([^<]*)<\/version>/,arr)){
    if(arr[1]=="com.mulesoft.connectors" || arr[1]=="org.mule.connectors"){
      if(++count==1){
         print "artifactId value,version"
      }
      print arr[2]","arr[3]
    }
    $0=substr($0,RSTART+RLENGTH)
  }
}
'  Input_file
echo "${input_data}" | 

mawk NF=NF FS='<[/]artifactId>[^>]+>'     OFS=',' \
         RS='(<[/]version>\n[^\n]+\n+)?([^\n]+\n+[ \t]+<artifactId>)?'
mule-ibm-mq-connector,1.8.3
mule-file-connector,1.5.2
mule-salesforce-connector,10.8.1
mule-email-connector,1.1.8
mule-connector,1.4.1

the header rows should be trivial

Related