
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
-P
aktiviert reguläre Perl-Ausdrücke-o
druckt nur den passenden TeilIBM/WebSphere/\K
der Anfang des Teils, bis zu\K
dem 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..*java
Im zweiten möchten Sie auch bis zum Ende des Java-Befehls eine Übereinstimmung finden (bisjava
ein Leerzeichen folgt).
Antwort2
ps -Aocomm= | sed -ne'/java$/s|.*/\([0-9]\.\)|\1|p'
Es sieht aus wie ps
eine 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 grep
die Ergebnisse pingen, weil das Suchmuster für.*java.*
oder was auch immer, passt dann wahrscheinlich zu dem grep
von 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
printf "7.0\n8.5\n"
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
Das wird ein wenig knifflig, denn
grep -o "[0-9].[0-9]"Eingang
ergibt die Ausgabe7.0 8.5 1.7
weil es jede Sequenz findet und es zwei davon in der zweiten Zeile der Eingabe gibt. Aber
digit.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
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.digit
1.7
8.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 grep
mit 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