226 votes

Comment spécifier plus d'espaces pour le délimiteur en utilisant cut ?

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, je souhaite atteindre la valeur '3744', quel délimiteur de champ dois-je utiliser ?

$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' ' n'est pas ce que je veux, car elle ne concerne qu'un seul espace. awk n'est pas non plus ce que je recherche, mais comment faire avec "couper" ?

Merci.

16 votes

La meilleure réponse est d'utiliser tr comme indiqué ici : stackoverflow.com/a/4483833/168143

1 votes

Sans rapport direct avec la question posée, mais au lieu de ps + grep vous pourriez utiliser pgrep qui est disponible dans la plupart des distros modernes. Il retournera le résultat exactement sous la forme dont vous avez besoin.

356voto

paxdiablo Points 341644

En fait, awk es exactement l'outil sur lequel vous devriez vous pencher :

ps axu | grep '[j]boss' | awk '{print $5}'

ou vous pouvez abandonner le grep depuis awk connaît les expressions régulières :

ps axu | awk '/[j]boss/ {print $5}'

Mais si, pour une raison bizarre, vous voulez vraiment ne peut pas utiliser awk Il y a d'autres choses plus simples à faire, comme réduire tous les espaces blancs à un seul espace en premier :

ps axu | grep '[j]boss' | sed 's/\s\s*/ /g' | cut -d' ' -f5

Ce grep L'astuce, d'ailleurs, est un bon moyen de n'obtenir que l'élément jboss et non les grep jboss (idem pour le awk également).

Le site grep aura un processus littéral grep [j]boss dans sa commande de processus, et ne sera donc pas prise en compte par la commande grep lui-même, qui recherche la classe de caractères [j] suivi par boss .

C'est un moyen astucieux d'éviter la | grep xyz | grep -v grep paradigme que certaines personnes utilisent.

2 votes

Excellente réponse. Je reviendrai la consulter la prochaine fois que j'en aurai besoin.

0 votes

Le site grep semble ne pas fonctionner dans les fichiers crontab. Quelle en est la raison ?

3 votes

Je continue à apprendre et à oublier l'astuce grep. Merci pour mon plus récent rappel. Peut-être que cette fois ça va coller. Mais je ne parierais pas dessus.

135voto

fedorqui Points 42938

awk est probablement le meilleur moyen de procéder, mais vous pouvez également utiliser cut si vous comprimez d'abord les répétitions avec tr :

ps axu | grep jbos[s] | tr -s ' ' | cut -d' ' -f5
#        ^^^^^^^^^^^^   ^^^^^^^^^   ^^^^^^^^^^^^^
#              |            |             |
#              |            |       get 5th field
#              |            |
#              |        squeeze spaces
#              |
#        avoid grep itself to appear in the list

12 votes

Illustration fantaisiste.

2 votes

tr -s ' ' c'est très bien ! J'espère pouvoir m'en souvenir mieux que awk

0 votes

@Chris je dois objecter :D Awk est bien meilleur pour ces choses là !!

9voto

arielf Points 704

Solution plus courte/simple : utiliser cuts (coupé sur les stéroïdes que j'ai écrit)

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

Notez que cuts les index de champ sont basés sur zéro, donc le 5e champ est spécifié comme 4

http://arielf.github.io/cuts/

Et encore plus court (sans utiliser de coupe du tout) est :

pgrep jboss

8voto

Jared Ng Points 2013

Une façon de contourner ce problème est d'y aller :

$ps axu | grep jboss | sed 's/\s\+/ /g' | cut -d' ' -f3

pour remplacer plusieurs espaces consécutifs par un seul.

0 votes

Bizarre, cela ne fonctionne pas sur OS X. La commande sed ne change pas les espaces multiples en un espace.

2 votes

\s est une extension de GNU sed. Sous OS X, vous pouvez passer l'option -E à sed pour activer les expressions régulières étendues, puis utilisez [[:space:]] à la place de \s comme ça : sed -E 's/[[:space:]]+/ /g'

5voto

paulsm4 Points 39422

Personnellement, j'ai tendance à utiliser awk pour ce genre de travail. Par exemple :

ps axu| grep jboss | grep -v grep | awk '{print $5}'

6 votes

Cela peut se résumer à ps axu | awk '/[j]boss/ {print $5}' .

1 votes

Awk n'est-il pas plus lent (surtout lorsqu'il y a d'autres processus superflus), que sed / grep / cut ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X