Usando sed para imprimir e substituir texto na saída do comando ps

0
  1. Como imprimir a coluna tty do 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. Como substituir as linhas de TTY por 'terminal'?

por Ktgvb 01.10.2017 / 12:44

2 respostas

7

1. Como imprimir a coluna tty de ps com sed ?

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

Explicações

Usarei para o caractere de espaço.

  • s/A/B/ - s ubstitute A por B uma vez por linha
  • ␣* - 0 ou mais espaços
  • [^␣]* - 0 ou mais caracteres que não são ( ^ ) um espaço
  • \(…\) - um grupo, tudo dentro dos colchetes com escape é salvo como , pois é o primeiro grupo aqui
  • .* - 0 ou mais ocorrências de qualquer caractere, exceto nova linha
  • - chama o grupo antes de salvo

Formas alternativas

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

2. Como substituir a linha TTY por “terminal”?

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

Explicações

  • 2,$ - processa cada linha do segundo para o último (então, deixe a primeira linha de fora) - Eu assumi que você quer que o título TTY permaneça, se não omitir isso.
  • [^0-9␣] - qualquer caractere, exceto um destes: 0123456789␣
  • terminal - a string terminal

Forma alternativa

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

ps tem muitas opções - você não precisa analisá-la para obter a saída desejada (o mesmo se aplica a muitos comandos, mas isso é especialmente inútil com ps porque a saída obtida incluirá a saída programa analisando a saída ...)

Se você realmente quiser, pode analisá-lo para imprimir a coluna TTY com sed da seguinte forma:

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

Notas

  • -r usa regex estendido
  • s/old/new/ replace old com new
  • ^ início da linha
  • + um ou mais do caractere anterior
  • ([^ ]+) salva alguns caracteres não espaciais mais tarde
  • .* qualquer número de caracteres
  • de referência anterior ao padrão salvo

Você provavelmente pode substituir o texto do pts assim:

$ 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

Notas

  • s:old:new: replace old com new
  • \? zero ou um dos caracteres anteriores
  • [0-9]* zero ou mais dígitos
por Zanna 01.10.2017 / 13:12