Grep por um número na fila

1

Eu preciso das 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
    
por Amir 31.10.2015 / 19:24

4 respostas

4

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 correspondente
  • IBM/WebSphere/\K o início da parte até \K , que esvazia a variável correspondente, portanto, isso não será 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 por um espaço).
por 31.10.2015 / 19:32
3
ps -Aocomm= | sed -ne'/java$/s|.*/\([0-9]\.\)||p'

Parece que há ps de saída, mas, em caso afirmativo, é provavelmente um erro incluir os argumentos nos comandos para os quais você procura. Isso é especialmente verdadeiro se você for grep ping nos resultados porque o padrão de pesquisa para .*java.* ou what-have-you provavelmente corresponderá ao comando grep executado.

Felizmente, você pode procurar apenas o comm= e o nome e podar esses resultados como eu faço acima, que deve lidar com Saída 2 . Para o primeiro:

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

Se não for ps , isso também funcionará:

sed 's|.*/\([0-9]\.[^ ]*\).*||' <in

... para Saída 2 e ...

sed 's|.*/\([0-9]\..\).*||' <in

... para Saída 1 ...

    
por 31.10.2015 / 19:34
2

Como você não descreveu o que deseja, mas apenas mostrada entrada e 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 no que você realmente quer

  1. Isso pode ser um pouco complicado, desde

    grep -o "[0-9].[0-9]" input
    produz a saída
    7.0
    8.5
    1.7
    

    porque encontra todas as sequências digit.digit , e há dois deles na segunda linha da entrada. Mas

    grep -o "/[0-9].[0-9]/" input
    produz a saída
    /7.0/
    /8.5/
    

    (cada /digit.digit/ de sequência), que pode estar perto do que você quer, e então

    grep -o "/[0-9]\.[0-9]/" input | grep -o "[0-9]\.[0-9]"

    produz a saída

    7.0
    8.5
    
  2. grep -o "[0-9]\.[0-9][^ ]*" input

    obtém todas as sequências de caracteres não em branco começando com digit.digit . 1.7 não recebe uma linha para si porque está incluído na linha 8.5/… .

por 31.10.2015 / 22:47
1

Usando grep com PCRE ( -P ):

Primeiro:

$ grep -Po '/\K[[:digit:].]+(?=/)' file.txt 
7.0
8.5

Segundo:

$ grep -Po '/\K[[:digit:].]+/[^ ]+' file.txt 
7.0/UpdateInstaller/java/jre/bin/java
8.5/AppServer/java_1.7_64/jre/bin/java
  • No primeiro caso, /\K[[:digit:].]+(?=/) obterá os números no formato /x.y/ , em que x e y são ambos dígitos

  • /\K[[:digit:].]+/[^ ]+ procurará a substring indicando /x.y/ para um espaço que é nossa parte desejada no segundo caso

por 01.11.2015 / 07:56