linea leer fichero examples comando linux delimiter cut

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.


Solución más corta / más simple: use cuts (recorte los esteroides que hice)

ps axu | grep ''[j]boss'' | cuts 4

Tenga en cuenta que los índices de campo de cuts están basados ​​en cero, por lo que el 5to campo se especifica como 4

cuts

Y aún más corto (sin usar ningún corte) es:

pgrep jboss


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