Grep für eine Zahl in der Zeile

Grep für eine Zahl in der Zeile

Muss ich die folgenden beiden Ausgaben erhalten?

Eingang

/usr/IBM/WebSphere/7.0/UpdateInstaller/java/jre/bin/java -Declipse.security -Dwas.status.socket=48101
/home/axg009/usr/IBM/WebSphere/8.5/AppServer/java_1.7_64/jre/bin/java -Declipse.security -Dwas.status.socket=48101

Ausgabe 1

7.0
8.5

Ausgabe 2

7.0/UpdateInstaller/java/jre/bin/java
8.5/AppServer/java_1.7_64/jre/bin/java

Antwort1

Für den ersten:

grep -oP 'IBM/WebSphere/\K[0-9]\.[0-9]' file

Für den zweiten:

grep -oP 'IBM/WebSphere/\K[0-9]\.[0-9].*java ' file
  • -Paktiviert reguläre Perl-Ausdrücke
  • -odruckt nur den passenden Teil
  • IBM/WebSphere/\Kder Anfang des Teils, bis zu \Kdem die passende Variable geleert wird, sodass dies nicht Teil dessen ist, was gedruckt wird
  • [0-9]\.[0-9]eine Ziffer, gefolgt von einem Punkt, gefolgt von einer weiteren Ziffer.
    • .*javaIm zweiten möchten Sie auch bis zum Ende des Java-Befehls eine Übereinstimmung finden (bis javaein Leerzeichen folgt).

Antwort2

ps -Aocomm= | sed -ne'/java$/s|.*/\([0-9]\.\)|\1|p'

Es sieht aus wie pseine Ausgabe, aber wenn das so ist, ist es wahrscheinlich ein Fehler, die Argumente in die Befehle einzuschließen, nach denen Sie suchen. Dies gilt insbesondere, wenn Sie grepdie Ergebnisse pingen, weil das Suchmuster für.*java.*oder was auch immer, passt dann wahrscheinlich zu dem grepvon Ihnen ausgeführten Befehl.

Glücklicherweise können Sie nur nach dem comm=Namen und dem Namen suchen und diese Ergebnisse wie oben beschrieben beschneiden.Ausgabe 2. Zum Ersten:

ps -Aocomm= | sed -ne'/java$/s|.*/\([0-9]\..\).*|\1|p'

Wenn nicht ps, funktioniert auch Folgendes:

sed 's|.*/\([0-9]\.[^ ]*\).*|\1|' <in

...fürAusgabe 2, Und...

sed 's|.*/\([0-9]\..\).*|\1|' <in

...fürAusgabe 1...

Antwort3

Da Sie nichtbeschriebenwas du willst, aber nur Input und Output 1 angezeigt bekommt , gibt es sehr viele mögliche Antworten.

Dumme

  1. printf "7.0\n8.5\n"
  2. printf "7.0/UpdateInstaller/java/jre/bin/java\n8.5/AppServer/java_1.7_64/jre/bin/java\n"

Diese haben den Vorteil, dass Sie die Eingabe nicht einmal lesen müssen.

Meine beste Vermutung darüber, was Sie wirklich wollen

  1. Das wird ein wenig knifflig, denn

    grep -o "[0-9].[0-9]"Eingang
    ergibt die Ausgabe

    7.0
    8.5
    1.7
    

    weil es jede Sequenz findet und es zwei davon in der zweiten Zeile der Eingabe gibt. Aberdigit.digit

    grep -o "/[0-9].[0-9]/"Eingang
    ergibt die Ausgabe

    /7.0/
    /8.5/
    

    (jede Sequenz), die dem, was Sie wollen, nahe kommt, und dann/digit.digit/

    grep -o "/[0-9]\.[0-9]/"Eingang| grep -o "[0-9]\.[0-9]"

    ergibt die Ausgabe

    7.0
    8.5
    
  2. grep -o "[0-9]\.[0-9][^ ]*"Eingang

    ruft jede Folge von Zeichen ab, die nicht leer sind und mit beginnen .  erhält keine eigene Zeile, weil es in die Zeile aufgenommen wird.digit.digit1.78.5/…

____________
1 Bitte geben Sie in Ihren Fragen immer Beispiele für Input und Output an. AberAuchBeschreibe, wie Du von der Eingabe zur Ausgabe gelangen willst, sonst kriegst Du dumme Antworten.

Antwort4

Verwendung grepmit PCRE ( -P):

Erster:

$ grep -Po '/\K[[:digit:].]+(?=/)' file.txt 
7.0
8.5

Das Zweite:

$ grep -Po '/\K[[:digit:].]+/[^ ]+' file.txt 
7.0/UpdateInstaller/java/jre/bin/java
8.5/AppServer/java_1.7_64/jre/bin/java
  • Im ersten Fall /\K[[:digit:].]+(?=/)erhalten Sie die Zahlen im Format /x.y/, in dem x und y beide Ziffern sind

  • /\K[[:digit:].]+/[^ ]+sucht nach der Teilzeichenfolge, die von /x.y/bis zu einem Leerzeichen reicht, das im zweiten Fall unser gewünschter Teil ist

verwandte Informationen