Grep 找出行中的數字

Grep 找出行中的數字

我需要得到以下兩個輸出?

輸入

/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那裡的輸出,但是,如果是這樣,則將參數包含到您搜尋的命令中可能是錯誤的。如果您要grepping 結果,則尤其如此,因為搜尋模式.*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,有很多可能的答案。

愚蠢的人

  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"

這些的優點是您甚至不需要讀取輸入。

我對你真正想要什麼的最佳猜測

  1. 這有點棘手,因為

    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
    
  2. grep -o "[0-9]\.[0-9][^]*"輸入

    取得以 開頭的所有非空白字元序列。  本身沒有一行,因為它包含在該行中。digit.digit1.78.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/到空格的子字串,這是第二種情況下我們想要的部分

相關內容