我需要得到以下两个输出?
输入
/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/
到空格的子字符串,这是第二种情况下我们想要的部分