Existe-t-il un moyen de spécifier un délimiteur de champ pour plus d'espaces avec la commande cut? (comme "" +)? Par exemple: dans la chaîne suivante, j'aime atteindre la valeur '3744', quel délimiteur de champ dois-je dire?
$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' '
ce n'est pas ce que je veux, car ce n'est que pour un seul espace.
awk
n'est pas ce que je recherche non plus, mais comment faire avec 'cut'?
Merci.
tr
comme indiqué ici: stackoverflow.com/a/4483833/168143ps
+,grep
vous pouvez utiliserpgrep
ce qui est disponible dans la plupart des distributions modernes. Il renverra le résultat exactement sous la forme dont vous avez besoin.Réponses:
En fait,
awk
c'est exactement l'outil que vous devriez étudier:ou vous pouvez abandonner le
grep
tout car ilawk
connaît les expressions régulières:Mais si, pour une raison étrange, vous ne pouvez vraiment pas l' utiliser
awk
, vous pouvez faire d'autres choses plus simples, comme réduire d'abord tous les espaces en un seul espace:Cette
grep
astuce, soit dit en passant, est un bon moyen d'obtenir uniquement lesjboss
processus et nongrep jboss
celui (idem pour laawk
variante également).Le
grep
processus aura un littéralgrep [j]boss
dans sa commande process, il ne sera donc pas pris pargrep
lui - même, qui recherche la classe de caractères[j]
suivie parboss
.C'est une façon astucieuse d'éviter le
| grep xyz | grep -v grep
paradigme que certaines personnes utilisent.la source
grep
astuce ne semble pas fonctionner dans les fichiers crontab. N'importe quelle raison?awk
la version est probablement la meilleure façon de procéder, mais vous pouvez également l'utilisercut
si vous appuyez d'abord sur les répétitions avectr
:la source
tr -s ' '
est très bien! J'espère que je m'en souviendrai mieux queawk
J'aime utiliser la commande tr -s pour cela
Cela réduit tous les espaces blancs à 1 espace. De cette façon, dire à cut d'utiliser un espace comme délimiteur est honoré comme prévu.
la source
Je vais proposer
tr -s [:blank:]
comme meilleure réponse.Pourquoi voulons-nous utiliser la coupe? Il a la commande magique qui dit "nous voulons le troisième champ et chaque champ après, en omettant les deux premiers champs"
Je ne crois pas qu'il existe une commande équivalente pour le fractionnement awk ou perl où nous ne savons pas combien de champs il y aura, c'est-à-dire que le troisième champ sera mis à travers le champ X.
la source
Solution plus courte / plus simple: utiliser
cuts
(couper sur les stéroïdes que j'ai écrits)Notez que
cuts
les index de champ sont basés sur zéro, donc le 5ème champ est spécifié comme 4http://arielf.github.io/cuts/
Et encore plus court (ne pas utiliser de coupe du tout) est:
la source
Un moyen de contourner cela est d’aller:
pour remplacer plusieurs espaces consécutifs par un seul.
la source
\s
est une extension GNU sed. Sur OS X, vous pouvez passer le-E
drapeau à sed pour activer les expressions régulières étendues, puis utiliser[[:space:]]
à la place de\s
, comme ceci:sed -E 's/[[:space:]]+/ /g'
Personnellement, j'ai tendance à utiliser awk pour des emplois comme celui-ci. Par exemple:
la source
ps axu | awk '/[j]boss/ {print $5}'
.Comme alternative, il y a toujours perl:
Ou, si vous souhaitez obtenir tous les champs à partir du champ n ° 3 (comme indiqué dans l'une des réponses ci-dessus):
la source
lsof
J'ai essayélsof|perl -lane 'print $F[5]'
cela obtient parfois la 5ème colonne, parfois la 6èmeSi vous souhaitez choisir des colonnes à partir d'une sortie ps, quelle raison de ne pas utiliser -o?
par exemple
Largeur de colonne minimale allouée, pas de remplissage, uniquement un séparateur de champ à espace unique.
Pid et vsz étant donné une largeur de 10 caractères, 1 séparateur de champ d'espace.
Utilisé dans un script: -
la source
Une autre façon si vous devez utiliser la commande cut
Dans Solaris, remplacez awk par
nawk
ou/usr/xpg4/bin/awk
la source
J'aime toujours la façon dont Perl gère les champs avec des espaces blancs.
Le premier champ est $ F [0].
la source
Mon approche consiste à stocker le PID dans un fichier dans / tmp et à trouver le bon processus en utilisant l'
-S
option pourssh
. Cela pourrait être une mauvaise utilisation, mais cela fonctionne pour moi.Une meilleure approche pourrait être de rechercher le
SSH_PID
droit avant de le tuer, car le fichier peut être périmé et tuer un mauvais processus.la source