Как вычесть два списка стандартных выводов в linux bash - PullRequest
2 голосов
/ 02 апреля 2020

обращайтесь за помощью.

У меня есть один список "A" из

netstat -ntlp | grep -oP ":[:1]?[:1]?(.*)+" | grep -oP "\d\d+"

, похоже,

80
443
8080
22
25

У меня есть еще один список "B" из

ufw status numbered | grep -oP "\] \d+" | grep -oP "\d+"

это выглядит как

80
443
22

Так что я хочу знать, какие порты слушают, но не открываются с помощью ufw, т.е. substract ["A"] - ["B"] и будут видеть

8080
25

с такой командой, как

netstat -ntlp | grep -oP ":[:1]?[:1]?(.*)+" | grep -oP "\d\d+" | SELECT ALL NOT IN `ufw status numbered | grep -oP "\] \d+" | grep -oP "\d+"`

Как это сделать?

Ответы [ 4 ]

3 голосов
/ 02 апреля 2020

Вы можете использовать grep:

grep -vxFf <(cmd2) <(cmd1)

Здесь замените cmd1 командой netstat ... и замените cmd2 командой ufw ....

3 голосов
/ 02 апреля 2020

Обычно это comm работа:

netstat -ntlp | grep -oP ":[:1]?[:1]?(.*)+" | grep -oP "\d\d+" |
sort | comm -23 - <(ufw status numbered | grep -oP "\] \d+" | grep -oP "\d+" | sort)
1 голос
/ 02 апреля 2020

Это решение требует предварительной сортировки выходов:

$ netstat -ntlp | grep -oP ":[:1]?[:1]?(.*)+" | grep -oP "\d\d+" | sort > A
                                                                 ^^^^^^
$ ufw status numbered | grep -oP "\] \d+" | grep -oP "\d+" | sort > B
                                                           ^^^^^^

Элементы, уникальные для A:

$ comm -23 A B
25
8080
$ 

... но также, если вам требуется, элементы, уникальные для B:

$ comm -13 A B
$ 

... и элементы, общие для A и B:

$ comm -12 A B
22
443
80
$ 

Подробнее см. man comm.

1 голос
/ 02 апреля 2020

Вы можете проверить команду uniq -u:

http://man7.org/linux/man-pages/man1/uniq.1.html

Вы передаете группу строк в uniq -d и перенаправляете на выход. Он будет печатать только дублированные. Так что вам просто нужно объединить оба результата из списка A и списка B в текст:

Список A:

netstat -ntlp | grep -oP ":[:1]?[:1]?(.*)+" | grep -oP "\d\d+" >> output.txt

Список B:

ufw status numbered | grep -oP "\] \d+" | grep -oP "\d+" > output.txt >> output.txt`

(ПРИМЕЧАНИЕ. Вы используете '>>' над '>', чтобы добавить содержимое в конец файла. Обязательно очищайте его на каждой итерации!)

Тогда:

uniq -u output.txt

Вы также можете перенаправить вывод uniq -u, если необходимо:

uniq -u output.txt > gotuniques.txt

Правка: форматирование Правка2: я был смущен -d, когда ответ требует -u.

...