Unix grep строка, затем показать только строку в списке - PullRequest
1 голос
/ 13 июня 2011

Может кто-нибудь помочь показать мне, как это сделать.

Я использую netstat, чтобы узнать, сколько серверов в настоящее время подключено к моим серверам, и у меня есть следующий список, server001 и 002 имеют ряд служб, подключенных к myserver01

myserver01.1050    server001.com.51535 64860      0 49680      0 ESTABLISHED
myserver01.1050    server001.com.36565 64860      0 49680      0 ESTABLISHED
myserver01.1050    server002.com.35262 64860      0 49680      0 ESTABLISHED
myserver01.1050    server002.com.41700 64860      0 49680      0 ESTABLISHED
myserver01.1050    server002.com.36525 64860      0 49680      0 ESTABLISHED
myserver01.1050    server002.com.54575 64860      0 49680      0 ESTABLISHED
myserver01.1050    server001.com.44401 64860      0 49680      0 ESTABLISHED
myserver01.1050    server001.com.47922 64860      0 49680      0 ESTABLISHED
myserver01.1050    server001.com.57080 49680      0 49680      0 ESTABLISHED

Может кто-нибудь сказать мне, как я могу grep или сортировать список, который я мог бы получить уникальное имя сервера, что-то вроде приведенного ниже

myserver01.1050    server001.com
myserver01.1050    server002.com

Спасибо

Ответы [ 7 ]

3 голосов
/ 14 июня 2011
$ cut -d'.' -f1-3 input | sort | uniq
myserver01.1050    server001.com
myserver01.1050    server002.com

и, используя uniq -c, вы также можете получить счет

$ cut -d'.' -f1-3 input | sort | uniq -c
      5 myserver01.1050    server001.com
      4 myserver01.1050    server002.com
2 голосов
/ 13 июня 2011

Это немного уродливо, но работает (6333197.txt содержит вывод netstat):

$ cat 6333197.txt | awk -F '.' '{print $1"."$2"."$3}' | sort -u

-F определяет разделитель поля ввода, ( awk man page )

1 голос
/ 13 июня 2011
cat netstat.txt | tr -s ' ' | cut -d" " -f2 | cut -d. -f1 | sort -u
1 голос
/ 13 июня 2011

Все это можно сделать одной командой awk в одну строку:

awk '{gsub(/\.[0-9]*$/, "", $2); serv[$2]=$1;} END{n=asorti(serv, dest); for (i = 1; i <= n; i++) print serv[dest[i]] " " dest[i];}' file.txt

ВЫХОД (с указанным выше входом):

myserver01.1050 server001.com
myserver01.1050 server002.com
0 голосов
/ 14 июня 2011

Использование sed и sort:

sed 's/\(.*\)\..*/\1/'  filename | sort -u
0 голосов
/ 13 июня 2011

Это версия с использованием sed и sort -u:

sed 's/^\(\S\S*\s\s*\S\S*\)\.[0-9][0-9]*\s.*/\1/' filename | sort -u

соотв.с GNU-версией sed и sort -u:

sed -r 's/^(\S+\s+\S+)\.[0-9]+\s.*/\1/' filename | sort -u
0 голосов
/ 13 июня 2011

Попробуйте это:

  $ grep myserver01.1050 logfile | \
    grep ' server' | \
    awk -F\. '{print $1, $2}' | \
    sort -u

Хотя я не могу сказать, хотите ли вы только имя сервера или только пару имен. Вроде угадал, извините, если я неправильно понял вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...