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/到空格的子字符串,这是第二种情况下我们想要的部分

相关内容