web-dev-qa-db-fra.com

Utilisation de sed pour imprimer et remplacer du texte dans la sortie de la commande ps

  1. Comment imprimer la colonne tty à partir de ps via sed?

      PID      TTY        TIME CMD
    13445    pts/7    00:00:00 bash
    15286    pts/7    00:00:00 sort
    15336    pts/7    00:00:00 sort
    18896    pts/7    00:00:00 sed
    19387    pts/7    00:00:00 ps
    
  2. Comment remplacer les lignes de téléscripteur par "terminal"?

1
Ktgvb

1. Comment imprimer la colonne tty de ps avec sed?

ps | sed 's/ *[^ ]* *\([^ ]*\).*/\1/'

Des explications

Je vais utiliser pour le caractère d'espace.

  • s/A/B/ - ssubstituer A par B une fois par ligne
  • ␣* - 0 ou plusieurs espaces
  • [^␣]* - 0 ou plusieurs caractères qui sont pas (^) un espace
  • \(…\) - un groupe, tout ce qui se trouve entre les crochets d'échappement est enregistré en tant que \1 car c'est le premier groupe ici
  • .* - 0 ou plusieurs occurrences de n'importe quel caractère sauf newline
  • \1 - appelle le groupe précédemment enregistré

Manières alternatives

ps -o tt
ps | awk '{print $2}'

2. Comment remplacer la ligne TTY par "terminal"?

ps | sed '2,$s/\([^0-9 ][^ ]*\)/terminal/'

Des explications

  • 2,$ - Traite chaque ligne de la seconde à la dernière (laissez donc la première ligne en retrait) - J'ai supposé que vous souhaitiez que la rubrique TTY reste, sinon omettez-la.
  • [^0-9␣] - tout caractère sauf un de ceux-ci: 0123456789␣
  • terminal - la chaîne terminal

Manière alternative

ps | sed '2,$s/\([0-9 ]*\)[^ ]*/\1terminal/'
ps | awk '{$2="terminal";print}' # change every line
ps | awk '{if(NR>1){$2="terminal"};print}' # omit first line
8
dessert

ps a beaucoup d'options - vous ne devriez pas avoir besoin de l'analyser pour obtenir le résultat souhaité (il en va de même pour de nombreuses commandes, mais cela est particulièrement inutile avec ps, car le résultat obtenu inclura le programme analyse la sortie ...)

Si vous voulez vraiment, vous pouvez l’analyser pour imprimer la colonne TTY avec sed comme ceci:

$ ps | sed -r 's/^ +[^ ]+ +([^ ]+) .*/\1/'
TTY
pts/4
pts/4
pts/4

Remarques

  • -r utilise une expression rationnelle étendue
  • s/old/new/ remplace old par new
  • ^ début de ligne
  • + un ou plusieurs des caractères précédents
  • ([^ ]+) enregistrer des caractères non-espace plus tard
  • .* un nombre quelconque de caractères
  • \1 référence arrière au motif enregistré

Vous pouvez probablement remplacer le texte pts comme ceci:

$ ps | sed 's:pts/\?[0-9]*:terminal:'
  PID TTY          TIME CMD
 3379 terminal    00:00:00 bash
 3466 terminal    00:00:00 ps
 3467 terminal    00:00:00 sed

Remarques

  • s:old:new: remplace old par new
  • \? zéro ou un des caractères précédents
  • [0-9]* zéro ou plusieurs chiffres
7
Zanna