Использование sed для печати и замены текста на выходе команды ps

Посмотрите на команду coreutils comm - man comm

NAME
       comm - compare two sorted files line by line

SYNOPSIS
       comm [OPTION]... FILE1 FILE2

DESCRIPTION
       Compare sorted files FILE1 and FILE2 line by line.

       With  no  options,  produce  three-column  output.  Column one contains
       lines unique to FILE1, column two contains lines unique to  FILE2,  and
       column three contains lines common to both files.

       -1     suppress column 1 (lines unique to FILE1)

       -2     suppress column 2 (lines unique to FILE2)

       -3     suppress column 3 (lines that appear in both files)

Так, например, вы можете сделать

$ comm -13 <(sort a.txt) <(sort b.txt)
diary.txt
NOVEMBER.txt

(строки, уникальные для b.txt )

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

5 ответов

1. Как напечатать столбец tty из ps с помощью sed?
ps | sed 's/ *[^ ]* *\([^ ]*\).*/\1/'

Объяснения

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

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

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

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

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

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

Объяснения

s/A/B/ - s ubstitute A на B один раз за line [^0-9␣] - любой символ, кроме одного из следующих: 0123456789␣ ␣* - 0 или более пробелов

Альтернативный способ

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
7
ответ дан 22 May 2018 в 17:57
[D0] 1. Как напечатать столбец tty из ps с помощью sed? ps | sed 's/ *[^ ]* *\([^ ]*\).*/\1/'

Объяснения

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

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

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

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

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

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

Объяснения

s/A/B/ - s ubstitute A на B один раз за line [^0-9␣] - любой символ, кроме одного из следующих: 0123456789␣ ␣* - 0 или более пробелов

Альтернативный способ

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
7
ответ дан 18 July 2018 в 05:56
[D0] 1. Как напечатать столбец tty из ps с помощью sed? ps | sed 's/ *[^ ]* *\([^ ]*\).*/\1/'

Объяснения

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

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

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

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

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

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

Объяснения

s/A/B/ - s ubstitute A на B один раз за line [^0-9␣] - любой символ, кроме одного из следующих: 0123456789␣ ␣* - 0 или более пробелов

Альтернативный способ

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
7
ответ дан 24 July 2018 в 18:28

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

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

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

Примечания [ ! d2] -r использовать расширенное regex s/old/new/ заменить old на new ^ начало строки + одного или нескольких из предшествующего символа ([^ ]+) сохранить некоторые символы без пробела позже [ f13] любое количество любых символов \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

Примечания

-r использовать расширенное regex \? ноль или один из предыдущего символа s/old/new/ заменить old на new
6
ответ дан 22 May 2018 в 17:57

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

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

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

Примечания [ ! d2] -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

Примечания

-r использовать расширенное regex \? ноль или один из предыдущего символа s/old/new/ заменить old на new
6
ответ дан 18 July 2018 в 05:56

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

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