¿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
no es lo que estoy buscando tampoco, pero ¿cómo hacer con 'cortar'?
Gracias.
tr
como se muestra aquí: stackoverflow.com/a/4483833/168143ps
+grep
, puede usar elpgrep
que está disponible en la mayoría de las distribuciones modernas. Le devolverá el resultado exactamente en la forma en que lo necesita.Respuestas:
En realidad
awk
es exactamente la herramienta que deberías estar buscando:o puedes deshacerte del
grep
todo ya queawk
conoce las expresiones regulares:Pero si, por alguna extraña razón, realmente no puedes usar
awk
, hay otras cosas más simples que puede hacer, como contraer primero todos los espacios en blanco en un solo espacio:Ese
grep
truco, por cierto, es una forma ordenada de obtener solo losjboss
procesos y no elgrep jboss
uno (lo mismo para elawk
variante).El
grep
proceso tendrá un literalgrep [j]boss
en su comando de proceso, por lo que no será capturado por elgrep
mismo, que busca la clase de caracteres[j]
seguida deboss
.Esta es una manera ingeniosa de evitar el
| grep xyz | grep -v grep
paradigma que usan algunas personas.fuente
grep
truco parece no funcionar en los archivos crontab. ¿Cualquier razón?awk
La versión es probablemente la mejor opción, pero también puedes usarlacut
si primero aprietas las repeticiones contr
:fuente
tr -s ' '
es muy lindo! Espero poder recordar eso mejor queawk
Me gusta usar el comando tr -s para esto
Esto exprime todos los espacios en blanco a 1 espacio. De esta manera, decir corte para usar un espacio como delimitador se cumple como se esperaba.
fuente
Voy a nominar
tr -s [:blank:]
como la mejor respuesta.¿Por qué queremos usar cortar? Tiene el comando mágico que dice "queremos el tercer campo y cada campo después de él, omitiendo los dos primeros campos"
No creo que haya un comando equivalente para la división awk o perl donde no sabemos cuántos campos habrá, es decir, colocar el tercer campo en el campo X.
fuente
Solución más corta / simple: uso
cuts
(corte en esteroides que escribí)Tenga en cuenta que
cuts
los índices de campo están basados en cero, por lo que el quinto campo se especifica como 4http://arielf.github.io/cuts/
E incluso más corto (sin usar corte en absoluto) es:
fuente
Una forma de evitar esto es ir:
para reemplazar múltiples espacios consecutivos con uno solo.
fuente
\s
es una extensión de sed de GNU. En OS X, puede pasar la-E
bandera a sed para habilitar expresiones regulares extendidas, luego usar[[:space:]]
en lugar de\s
, así:sed -E 's/[[:space:]]+/ /g'
Personalmente, tiendo a usar awk para trabajos como este. Por ejemplo:
fuente
ps axu | awk '/[j]boss/ {print $5}'
.Como alternativa, siempre hay perl:
O, si desea obtener todos los campos comenzando en el campo # 3 (como se indica en una de las respuestas anteriores):
fuente
lsof
Intentélsof|perl -lane 'print $F[5]'
esto a veces obtiene la quinta columna, a veces la sextaSi desea elegir columnas de una salida ps, ¿alguna razón para no usar -o?
p.ej
Ancho de columna mínimo asignado, sin relleno, solo separador de campo de espacio único.
Pid y vsz tienen un ancho de 10 caracteres, un separador de campo de 1 espacio.
Utilizado en un script: -
fuente
Otra forma si debe usar el comando de corte
En Solaris, reemplace awk con
nawk
o/usr/xpg4/bin/awk
fuente
Todavía me gusta la forma en que Perl maneja los campos con espacios en blanco.
El primer campo es $ F [0].
fuente
Mi enfoque es almacenar el PID en un archivo en / tmp, y encontrar el proceso correcto usando la
-S
opción parassh
. Eso podría ser un mal uso, pero funciona para mí.Un mejor enfoque podría ser consultar el
SSH_PID
derecho antes de matarlo, ya que el archivo podría estar obsoleto y mataría un proceso incorrecto.fuente