leer - Ayuda de linux cut: ¿cómo especificar más espacios para el delimitador?
comando sed (11)
¿Hay alguna forma de especificar un delimitador de campo para más espacios con el comando de corte? (como "" +)? Por ejemplo: en la siguiente cadena, me gusta alcanzar el valor ''3744'', ¿qué delimitador de campo debo decir?
$ps axu | grep jboss
jboss 2574 0.0 0.0 3744 1092 ? S Aug17 0:00 /bin/sh /usr/java/jboss/bin/run.sh -c example.com -b 0.0.0.0
cut -d'' ''
no es lo que quiero, ya que es solo para un solo espacio. awk
tampoco es lo que estoy buscando, ¿pero cómo hacerlo con ''cortar''?
Gracias.
Como alternativa, siempre hay perl:
ps aux | perl -lane ''print $F[3]''
O bien, si desea obtener todos los campos comenzando en el campo # 3 (como se indica en una de las respuestas anteriores):
ps aux | perl -lane ''print @F[3 .. scalar @F]''
En realidad, awk
es exactamente la herramienta que debería considerar:
ps axu | grep ''[j]boss'' | awk ''{print $5}''
o puedes abandonar el grep
completo ya que awk
sabe sobre expresiones regulares:
ps axu | awk ''/[j]boss/ {print $5}''
Pero si, por alguna extraña razón, realmente no puedes usar awk
, hay otras cosas más simples que puedes hacer, como colapsar primero todos los espacios en blanco en un espacio simple:
ps axu | grep ''[j]boss'' | sed ''s//s/s*/ /g'' | cut -d'' '' -f5
Ese truco de grep
, por cierto, es una manera ordenada de obtener solo los procesos de jboss
y no los grep jboss
uno (lo mismo para la variante de awk
también).
El proceso grep
tendrá un grep [j]boss
literal en su comando de proceso, por lo que no será atrapado por el grep
, que está buscando la clase de caracteres [j]
seguida por el boss
.
Esta es una forma ingeniosa de evitar el | grep xyz | grep -v grep
| grep xyz | grep -v grep
| grep xyz | grep -v grep
paradigma que algunas personas usan.
Me gusta usar el comando tr -s para esto
ps aux | tr -s [:blank:] | cut -d'' '' -f3
Esto comprime todos los espacios en blanco hasta 1 espacio. De esta manera, se dice que cortar para usar un espacio como delimitador se respeta como se esperaba.
Mi enfoque es almacenar el PID en un archivo en / tmp, y encontrar el proceso correcto usando la opción -S
para ssh
. Eso podría ser un mal uso pero funciona para mí.
#!/bin/bash
TARGET_REDIS=${1:-redis.someserver.com}
PROXY="proxy.somewhere.com"
LOCAL_PORT=${2:-6379}
if [ "$1" == "stop" ] ; then
kill `cat /tmp/sshTunel${LOCAL_PORT}-pid`
exit
fi
set -x
ssh -f -i ~/.ssh/aws.pem centos@$PROXY -L $LOCAL_PORT:$TARGET_REDIS:6379 -N -S /tmp/sshTunel$LOCAL_PORT ## AWS DocService dev, DNS alias
# SSH_PID=$! ## Only works with &
SSH_PID=`ps aux | grep sshTunel${LOCAL_PORT} | grep -v grep | awk ''{print $2}''`
echo $SSH_PID > /tmp/sshTunel${LOCAL_PORT}-pid
Un mejor enfoque podría ser consultar el SSH_PID
justo antes de matarlo, ya que el archivo podría estar obsoleto y podría matar a un proceso incorrecto.
Otra forma si debe usar comando de corte
ps axu | grep [j]boss |awk ''$1=$1''|cut -d'' '' -f5
En Solaris, reemplace awk con nawk
o /usr/xpg4/bin/awk
Personalmente, tiendo a usar awk para trabajos como este. Por ejemplo:
ps axu| grep jboss | grep -v grep | awk ''{print $5}''
Todavía me gusta la forma en que Perl maneja los campos con espacios en blanco.
El primer campo es $ F [0].
$ ps axu | grep dbus | perl -lane ''print $F[4]''
Una forma de evitar esto es ir:
$ps axu | grep jboss | sed ''s//s/+/ /g'' | cut -d'' '' -f3
para reemplazar espacios consecutivos múltiples con uno solo.
Voy a nominar tr -s [:blank:]
como la mejor respuesta.
¿Por qué queremos usar Cut? Tiene el comando mágico que dice "queremos el tercer campo y cada campo después de él, omitiendo los dos primeros campos"
cat log | tr -s [:blank:] |cut -d'' '' -f 3-
No creo que haya un comando equivalente para awk o perl split en el que no sepamos cuántos campos habrá, es decir, pongamos el tercer campo en el campo X.
awk
versión awk
es probablemente la mejor opción, pero también puedes usar cut
si primero exprimes las repeticiones con tr
:
ps axu | grep jbos[s] | tr -s '' '' | cut -d'' '' -f5
# ^^^^^^^^^^^^ ^^^^^^^^^ ^^^^^^^^^^^^^
# | | |
# | | get 5th field
# | |
# | squeeze spaces
# |
# avoid grep itself to appear in the list