AWK, объединенный с RegExp, очень подходит для обработки частей линий.
Основная идея однострочного нижнего уровня состоит в том, чтобы прокрутить линию и проверить наличие четырех цифр и точек, повторяется максимум 4 раза; в то же время мы можем проверить цифру, повторяющуюся от 2 до 4 раз для номера порта
awk '{for(i=1;i<=NF;i++) { if ($i~/[[:digit:]\.]{4}/) printf $i; if ( $i~/[[:digit:]]{2,4}/) printf ":"$i }}'
Пример прогона
$ echo "This sentence contains an ip number 1.2.3.4 and port number 50, i want to print the IP address only." | awk '{for(i=1;i<=NF;i++) { if ($i~/[[:digit:]\.]{4}/) printf $i; if ( $i~/[[:digit:]]{2,4}/) printf ":"$i }}'
1.2.3.4:50,
Ваше предложение содержит 50 и вместе без разделения, поэтому напечатаны вместе, но с gsub(/[[:punct:]]/,""), которые могут быть удалены при желании.