2017-01-26 6 views
-2

Я пытаюсь получить NetStat, AWK, и разрезают, чтобы работать вместе, чтобы разобрать две части NETSTAT выходаUnix, используя AWK и вырезать вместе

Я хочу, чтобы вытащить только последние 4 цифры первого столбца:

11.111.222.32.3433 
10.204.101.85.3433 
10.204.101.85.3433 

Что я могу сделать:

netstat -an |grep 3433 |awk '{print $1}' | cut -d "." -f5 

но я также хочу, чтобы напечатать вторую колонку, но оставить от 4 последних цифр

пример:

33.44.444.43.5555 
24.204.101.85.3434 
11.204.101.85.6533 

Так что я хочу, чтобы конечный результат, чтобы выглядеть как

3433 | 33.44.444.43 
3433 | 24.204.101.85 
3433 | 11.204.101.85 

Я попытался объединить два awks, но я получаю сообщение об ошибке

Возможно ли это?

Спасибо!

+4

Ваш ожидаемый результат не имеет смысла с вашим требованием! Можете ли вы повторно проверить его один раз? – Inian

ответ

1

для моей системы была Col 4 и 5 так, следующие работал для меня:

$ netstat -an|grep 3433|awk '{print $4,"|",$5}'|sed s/:/./g|cut -d '.' -f5-8 

как вы описали ваши данные, это должно работать для вас

$ netstat -an|grep 3433|awk '{print $1,"|",$2}'|cut -d '.' -f5-8 
+0

Спасибо! Это именно то, что я искал – connollyc4

+0

Вам никогда не понадобится grep, sed или cut, когда вы используете awk, так как это может привести к ожидаемому выходу, это нехорошее решение. –

0

Вы можете вырезать в awk, используя функцию awk split. Вы также можете фильтровать записи, используя условие регулярного выражения в awk, делая grep и cut излишним.

Что-то вроде следующего вы должны получить близко:

netstat -an | awk 'BEGIN{OFS=" | "} $1~/3433$/{split($1,a,"."); split($2,b,"."); print a[5], b[1]"."b[2]"."b[3]"."b[4] }' 

Это ломается, как:

  1. Установите разделитель полей вывода быть трубы между двумя пространствами
  2. Проверьте первое поле чтобы узнать, заканчивается ли оно 3433
  3. Разделить первое поле на период и сохранить результаты в массиве с именем a
  4. Разделить второе поле периодом и сохранить ее результаты в массиве с именем b
  5. Распечатайте пятый элемент массива a, а затем OFS, а затем 1-й, 2-е, 3-е и 4-й элементы массива b с периодом между ними.

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

Это будет выглядеть примерно так:

netstat -an | awk -F"[ .]" 'BEGIN{OFS="."} $5=="3433" { print $5" | " $6,$7,$8,$9}' 
0

прямой замены вашего Grep в awk

$ ... | awk -v OFS=' | ' '/3433/{sub(/.*\./,"",$1); sub(/\.[^.]+$/,"",$2)}1' 

3433 | 33.44.444.43 
3433 | 24.204.101.85 
3433 | 11.204.101.85 

однако, вы должны проверять $1~/3433$/ вместо этого.

0

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

echo " 33.44.444.43.5555 
24.204.101.85.3434 
11.204.101.85.6533" | sed 's/\(.*\)\.\([^.]*\)$/\2 | \1/' 
Смежные вопросы