Использование grep и логических операторов для сопоставления шаблонов в сценарии оболочки

Ваша реализация fold, по-видимому, рассматривает CR как пробел.

Поскольку причина, по которой у вас есть CR, заключается в том, что ваш вывод требует этого, выполняйте обработку, не беспокоясь о CR, и нормализуйте символы CR в конце.

… | sed 's/\r//g; s/$/\r/' | lpr

Эта команда sed удаляет все CR, а затем добавляет CR в конце каждой строки. Если ваша реализация sed не поддерживает \r, вместо этого вставьте буквальный символ возврата каретки (^M ).


trделает байт -для -переводов байтов, а не замены строки, поэтому tr "\n" "\n\r"не имеет смысла. (Ложный символ \rигнорируется. )Используйте такой инструмент, как sed, для замены строки.

0
05.06.2019, 11:19
2 ответа

Вы можете создать логический AND, снова запустив grep, и логический OR, используя регулярные выражения:

echo "$output" | grep "NXDOMAIN" | grep -E 'test1\.com|test2\.com'
0
28.01.2020, 02:30

Здесь нет необходимости в grepили bash.

#!/bin/sh -
input="/root/subdomains.txt"

contains() {
  case "$1" in
    (*"$2"*) true;;
    (*) false;;
  esac
}

while IFS= read <&3 -r line
do
    output=$(dig "$line")
    if
      contains "$output" NXDOMAIN && {
        contains "$output" test1.com || contains "$output" test2.com
      }
    then
      printf '%s\n' "$output"
    fi
done 3< "$input"

Если бы вы действительно хотели использовать grep, вы бы определили containsкак:

contains() {
  printf '%s\n' "$1" | grep -qFe "$2"
}

Но это было бы менее эффективно, поскольку означает порождение двух дополнительных процессов и в большинстве shреализаций выполнение внешней grepутилиты.

или:

#!/bin/sh -
input="/root/subdomains.txt"

match() {
  case "$1" in
    ($2) true;;
    (*) false;;
  esac
}

while IFS= read <&3 -r line
do
    output=$(dig "$line")
    if
      match "$output" '*NXDOMAIN*' &&
        match "$output" '*test[12].com*'
    then
      printf '%s\n' "$output"
    fi
done 3< "$input"

Или обойтись без промежуточной функции:

#!/bin/sh -
input="/root/subdomains.txt"

while IFS= read <&3 -r line
do
    output=$(dig "$line")
    case $output in
      (NXDOMAIN)
        case $output in
          (test1.com | test2.com) printf '%s\n' "$output"
        esac
    esac
done 3< "$input"

Это также будет работать с bash, но нет необходимости добавлять зависимость к bash, когда ваш (предположительно более быстрый и компактный )стандарт shможет это сделать.

2
28.01.2020, 02:30

Теги

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