
¿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
-P
activa expresiones regulares de Perl-o
imprime solo la parte correspondienteIBM/WebSphere/\K
el comienzo de la parte hasta\K
el 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..*java
en el segundo, desea hacer coincidir también hasta el final del comando java (hasta quejava
siga un espacio).
Respuesta2
ps -Aocomm= | sed -ne'/java$/s|.*/\([0-9]\.\)|\1|p'
Parece ps
un resultado allí, pero, si es así, probablemente sea un error incluir los argumentos de los comandos que busca. Esto es especialmente cierto si hace grep
ping a los resultados porque el patrón de búsqueda para.*java.*
o lo que tenga probablemente coincidirá con el grep
comando 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
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"
Tienen la ventaja de que ni siquiera es necesario leer la entrada.
Mi mejor suposición sobre lo que realmente quieres
Esto llega a ser un poco complicado, ya que
grep -o "[0-9].[0-9]"aporte
produce la salida7.0 8.5 1.7
porque encuentra todas las secuencias y hay dos en la segunda línea de la entrada. Pero
digit.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
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.digit
1.7
8.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 grep
con 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