Как запустить функцию «если» в оболочке, которая требует от пользователя ввода от 4 до 9 параметров

Обратите внимание, что grep '123.123.123.123'дает вам не первое вхождение123.123.123.123IP , а шаблон 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(), который просто ищет подстроки, мы решаем первую проблему, описанную выше, .соответствие любому символу, но не второму.

0
28.03.2019, 00:01
1 ответ

Звучит как домашнее задание, поэтому я дам вам все кусочки головоломки, которые вам понадобятся для ее решения.

  1. Количество аргументов хранится в специальной переменной $#.
  2. Третий аргумент $3.
  3. Чтобы узнать, находится ли переменная $varв диапазоне от 3 до 19 (включительно ), используйте

    if [ "$var" -ge 3 ] && [ "$var" -le 19 ]; then...; fi
    

    где ...— действие, которое вы хотели бы предпринять, если оператор верно .

  4. Явный выход из сценария выполняется с помощью exit. Явный возврат из функции выполняется с помощью return. Оба они принимают необязательный статус выхода.

1
28.04.2021, 23:35

Теги

Похожие вопросы