Busca un número en la fila

Busca un número en la fila

¿Necesito obtener las dos salidas siguientes?

Aporte

/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

Salida 1

7.0
8.5

Salida 2

7.0/UpdateInstaller/java/jre/bin/java
8.5/AppServer/java_1.7_64/jre/bin/java

Respuesta1

Para el primero:

grep -oP 'IBM/WebSphere/\K[0-9]\.[0-9]' file

Para el segundo:

grep -oP 'IBM/WebSphere/\K[0-9]\.[0-9].*java ' file
  • -Pactiva expresiones regulares de Perl
  • -oimprime solo la parte correspondiente
  • IBM/WebSphere/\Kel comienzo de la parte hasta \Kel cual se vacía la variable coincidente, por lo que esto no será parte de lo que se imprima
  • [0-9]\.[0-9]un dígito seguido de un punto seguido de otro dígito.
    • .*javaen el segundo, desea hacer coincidir también hasta el final del comando java (hasta que javasiga un espacio).

Respuesta2

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

Parece psun resultado allí, pero, si es así, probablemente sea un error incluir los argumentos de los comandos que busca. Esto es especialmente cierto si hace grepping a los resultados porque el patrón de búsqueda para.*java.*o lo que tenga probablemente coincidirá con el grepcomando que ejecute.

Afortunadamente sólo puedes buscar elcomm= nombre y podar esos resultados como lo hago arriba, lo que debería manejarSalida 2. Por el primero:

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

Si no es así ps, esto también funciona:

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

...paraSalida 2, y...

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

...paraSalida 1...

Respuesta3

ya que no lo has hechodescritolo que quieres, pero solo se muestra la entrada y la salida 1 , hay muchas respuestas posibles.

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"

Tienen la ventaja de que ni siquiera es necesario leer la entrada.

Mi mejor suposición sobre lo que realmente quieres

  1. Esto llega a ser un poco complicado, ya que

    grep -o "[0-9].[0-9]"aporte
    produce la salida

    7.0
    8.5
    1.7
    

    porque encuentra todas las secuencias y hay dos en la segunda línea de la entrada. Perodigit.digit

    grep -o "/[0-9].[0-9]/"aporte
    produce la salida

    /7.0/
    /8.5/
    

    (cada secuencia), que puede estar cerca de lo que desea, y luego/digit.digit/

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

    produce la salida

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

    obtiene cada secuencia de caracteres que no están en blanco y que comienzan con .  no obtiene una línea para sí mismo porque está incluido en la línea.digit.digit1.78.5/…

____________
1 Por favor, incluya siempre ejemplos de entradas y salidas en sus preguntas. PerotambiénDescribe cómo quieres pasar de la entrada a la salida, o obtendrás respuestas estúpidas.

Respuesta4

Usando grepcon PCRE ( -P):

El primero:

$ 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
  • Para el primer caso, /\K[[:digit:].]+(?=/)obtendrá los números en el formato /x.y/donde x e y son dígitos

  • /\K[[:digit:].]+/[^ ]+buscará la subcadena que indica desde /x.y/hasta un espacio que es nuestra parte deseada en el segundo caso

información relacionada