Grep para um número na linha

Grep para um número na linha

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
  • -Pativa expressões regulares Perl
  • -oimprime apenas a parte correspondente
  • IBM/WebSphere/\Ko início da parte até \Ka 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.
    • .*javano segundo, você deseja corresponder também até o final do comando java (até javaseguido de um espaço).

Responder2

ps -Aocomm= | sed -ne'/java$/s|.*/\([0-9]\.\)|\1|p'

Parece psuma saída, mas, nesse caso, provavelmente é um erro incluir os argumentos nos comandos que você procura. Isso é especialmente verdadeiro se você fizer grepping nos resultados porque o padrão de pesquisa para.*java.*ou o que você tem provavelmente corresponderá ao grepcomando 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

  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"

Eles têm a vantagem de você nem precisar ler a entrada.

Meu melhor palpite sobre o que você realmente deseja

  1. Isso pode ser um pouco complicado, pois

    grep -o "[0-9].[0-9]"entrada
    produz a saída

    7.0
    8.5
    1.7
    

    porque encontra todas as sequências e há duas delas na segunda linha da entrada. Masdigit.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
    
  2. 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.digit1.78.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 grepcom 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

informação relacionada