
Preciso obter as duas saídas abaixo?
Entrada
/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
Saída 1
7.0
8.5
Saída 2
7.0/UpdateInstaller/java/jre/bin/java
8.5/AppServer/java_1.7_64/jre/bin/java
Responder1
Para o primeiro:
grep -oP 'IBM/WebSphere/\K[0-9]\.[0-9]' file
Para o segundo:
grep -oP 'IBM/WebSphere/\K[0-9]\.[0-9].*java ' file
-P
ativa expressões regulares Perl-o
imprime apenas a parte correspondenteIBM/WebSphere/\K
o início da parte até\K
a qual esvazia a variável correspondente, portanto não fará parte do que é impresso[0-9]\.[0-9]
um dígito seguido por um ponto seguido por outro dígito..*java
no segundo, você deseja corresponder também até o final do comando java (atéjava
seguido de um espaço).
Responder2
ps -Aocomm= | sed -ne'/java$/s|.*/\([0-9]\.\)|\1|p'
Parece ps
uma saída, mas, nesse caso, provavelmente é um erro incluir os argumentos nos comandos que você procura. Isso é especialmente verdadeiro se você fizer grep
ping nos resultados porque o padrão de pesquisa para.*java.*
ou o que você tem provavelmente corresponderá ao grep
comando que você executa.
Felizmente, você pode pesquisar apenas pelo comm=
nome e e remover esses resultados como fiz acima, o que deve lidar comSaída 2. Pela primeira vez:
ps -Aocomm= | sed -ne'/java$/s|.*/\([0-9]\..\).*|\1|p'
Se não for ps
, isso também funciona:
sed 's|.*/\([0-9]\.[^ ]*\).*|\1|' <in
...paraSaída 2, e...
sed 's|.*/\([0-9]\..\).*|\1|' <in
...paraSaída 1...
Responder3
Já que você nãodescritoo que você deseja, mas mostra apenas a entrada e a saída 1 , há muitas respostas possíveis.
Estúpidos
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"
Eles têm a vantagem de você nem precisar ler a entrada.
Meu melhor palpite sobre o que você realmente deseja
Isso pode ser um pouco complicado, pois
grep -o "[0-9].[0-9]"entrada
produz a saída7.0 8.5 1.7
porque encontra todas as sequências e há duas delas na segunda linha da entrada. Mas
digit.digit
grep -o "/[0-9].[0-9]/"entrada
produz a saída/7.0/ /8.5/
(cada sequência), que pode estar próximo do que você deseja, e então
/digit.digit/
grep -o "/[0-9]\.[0-9]/"entrada| grep -o "[0-9]\.[0-9]"
produz a saída
7.0 8.5
grep -o "[0-9]\.[0-9][^ ]*"entrada
obtém todas as sequências de caracteres não vazios começando com . não recebe uma linha para si mesmo porque está incluído na linha.
digit.digit
1.7
8.5/…
____________
1 Por favor, inclua sempre exemplos de entrada e saída em suas perguntas. Mastambémdescreva como você deseja passar da entrada à saída ou obterá respostas estúpidas.
Responder4
Usando grep
com PCRE ( -P
):
Primeiro:
$ grep -Po '/\K[[:digit:].]+(?=/)' file.txt
7.0
8.5
O segundo:
$ grep -Po '/\K[[:digit:].]+/[^ ]+' file.txt
7.0/UpdateInstaller/java/jre/bin/java
8.5/AppServer/java_1.7_64/jre/bin/java
Para o primeiro caso,
/\K[[:digit:].]+(?=/)
obteremos os números no formato/x.y/
onde x e y são dígitos/\K[[:digit:].]+/[^ ]+
irá procurar a substring informando from/x.y/
para um espaço que é a nossa porção desejada no segundo caso