Обратите внимание, что grep '123.123.123.123'
дает вам не первое вхождение123.123.123.123
IP , а шаблон 123.123.123.123
, который соответствует 123.123.123.123
, а также 1234123-123e123
, поскольку .
оператор регулярного выражения, который соответствует любому одиночному символу.
123\.123\.123\.123
будет соответствовать только 123.123.123.123
, но обратите внимание, что 23\.123\.123\.1
тоже. См. также параметр -F
для grep
для фиксированного сопоставления строк -.
Вот, я бы сделал:
awk '
!ips_seen {ip[$0]; n++; next}
{
found = 0
for (i in ip)
if (index($0, i)) {
found = 1
delete ip[i]
n--
}
}
found
!n {exit}' ips.txt ips_seen=1 input.txt
Где ips.txt
содержит список IP-адресов, по одному в строке.
Обратите внимание, что мы позаботились о том, чтобы если одна строка содержала более одного IP-адреса, она все равно печаталась только один раз.
Используя index()
, который просто ищет подстроки, мы решаем первую проблему, описанную выше, .
соответствие любому символу, но не второму.
Звучит как домашнее задание, поэтому я дам вам все кусочки головоломки, которые вам понадобятся для ее решения.
$#
. $3
. Чтобы узнать, находится ли переменная $var
в диапазоне от 3 до 19 (включительно ), используйте
if [ "$var" -ge 3 ] && [ "$var" -le 19 ]; then...; fi
где ...
— действие, которое вы хотели бы предпринять, если оператор верно .
Явный выход из сценария выполняется с помощью exit
. Явный возврат из функции выполняется с помощью return
. Оба они принимают необязательный статус выхода.