Используя sed, чтобы распечатать и заменить текст в выводе команды PS

  1. Как распечатать tty столбец от PS через 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. Как заменить строки TTY с 'терминалом'?

2
задан 1 October 2017 в 14:18

2 ответа

1. Как распечатать tty столбец от ps с sed?

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

Объяснения

Я буду использовать для пробела.

  • s/A/B/sзамена A B одно время на строку
  • ␣* – 0 или больше пробелов
  • [^␣]* – 0 или больше символов, которые не являются (^) пространство
  • \(…\) – группа, все в завершенных скобках сохраняется как \1 поскольку это - первая группа здесь
  • .* – 0 или больше происшествий любого символа кроме новой строки
  • \1 – звонит перед сохраненной группой

Альтернативные пути

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

2. Как заменить строку TTY “терминалом”?

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

Объяснения

  • 2,$ – обработайте каждую строку от второго до последнего (поэтому пропустите первую строку) – я предположил, что Вы хотите TTY заголовок для пребывания, если не просто опускают это.
  • [^0-9␣] – любой символ кроме одного из них: 0123456789␣
  • terminal – строка terminal

Альтернативный путь

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
9
ответ дан 2 December 2019 в 01:25

ps имеет много опций - Вы не должны должны быть анализировать его для получения вывода, который Вы хотите (то же относится ко многим командам, но это особенно бесполезно с ps потому что вывод, который Вы получаете, будет включать программу, анализирующую вывод...),

Если Вы действительно хотите к тому, хотя, можно проанализировать его для печати столбца TTY с sed как это:

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

Примечания

  • -r используйте расширенный regex
  • s/old/new/ замена old с new
  • ^ запустите строки
  • + один или несколько из предшествующего символа
  • ([^ ]+) сохраните некоторые непробелы позже
  • .* любое количество любых символов
  • \1 обратная ссылка на сохраненный шаблон

Можно, вероятно, заменить pts текст как это:

$ 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

Примечания

  • s:old:new: замена old с new
  • \? нуль или один из предшествующего символа
  • [0-9]* нуль или больше цифр
7
ответ дан 2 December 2019 в 01:25

Другие вопросы по тегам:

Похожие вопросы: