
我需要得到以下兩個輸出?
輸入
/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
輸出1
7.0
8.5
輸出2
7.0/UpdateInstaller/java/jre/bin/java
8.5/AppServer/java_1.7_64/jre/bin/java
答案1
對於第一個:
grep -oP 'IBM/WebSphere/\K[0-9]\.[0-9]' file
對於第二個:
grep -oP 'IBM/WebSphere/\K[0-9]\.[0-9].*java ' file
-P
啟動 Perl 正規表示式-o
只列印匹配的部分IBM/WebSphere/\K
部分的開頭,直到\K
清空匹配變量,因此這不會成為列印內容的一部分[0-9]\.[0-9]
一個數字後面跟著一個點,後面跟著另一個數字。.*java
在第二個中,您還想匹配直到 java 命令結尾(直到java
後面跟著一個空格)。
答案2
ps -Aocomm= | sed -ne'/java$/s|.*/\([0-9]\.\)|\1|p'
它看起來像ps
那裡的輸出,但是,如果是這樣,則將參數包含到您搜尋的命令中可能是錯誤的。如果您要grep
ping 結果,則尤其如此,因為搜尋模式.*java.*
或者“what-have-you”可能會與grep
您執行的命令相符。
幸運的是,您可以只搜尋comm=
和名稱並修剪這些結果,就像我上面所做的那樣,這應該可以處理輸出2。為了第一:
ps -Aocomm= | sed -ne'/java$/s|.*/\([0-9]\..\).*|\1|p'
如果不是ps
,那麼這也有效:
sed 's|.*/\([0-9]\.[^ ]*\).*|\1|' <in
……為了輸出2, 和...
sed 's|.*/\([0-9]\..\).*|\1|' <in
……為了輸出1…
答案3
既然你還沒有描述你想要什麼,但只顯示輸入和輸出1,有很多可能的答案。
愚蠢的人
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"
這些的優點是您甚至不需要讀取輸入。
我對你真正想要什麼的最佳猜測
這有點棘手,因為
grep -o "[0-9].[0-9]"輸入
產生輸出7.0 8.5 1.7
因為它找到了每個序列,並且輸入的第二行有兩個序列。但
digit.digit
grep -o "/[0-9].[0-9]/"輸入
產生輸出/7.0/ /8.5/
(每個序列),這可能接近你想要的,然後
/digit.digit/
grep -o "/[0-9]\.[0-9]/"輸入| grep -o "[0-9]\.[0-9]"
產生輸出
7.0 8.5
grep -o "[0-9]\.[0-9][^]*"輸入
取得以 開頭的所有非空白字元序列。 本身沒有一行,因為它包含在該行中。
digit.digit
1.7
8.5/…
____________
1請務必在您的問題中包含範例輸入和輸出。但也描述你想要如何從輸入到輸出,否則你會得到愚蠢的答案。
答案4
grep
與 PCRE ( ) 一起使用-P
:
第一:
$ grep -Po '/\K[[:digit:].]+(?=/)' file.txt
7.0
8.5
第二個:
$ grep -Po '/\K[[:digit:].]+/[^ ]+' file.txt
7.0/UpdateInstaller/java/jre/bin/java
8.5/AppServer/java_1.7_64/jre/bin/java
對於第一種情況,
/\K[[:digit:].]+(?=/)
將會得到格式/x.y/
為 x 和 y 均為數字的數字/\K[[:digit:].]+/[^ ]+
將查找表示 from/x.y/
到空格的子字串,這是第二種情況下我們想要的部分