Ваша реализация 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, для замены строки.
Вы можете создать логический AND
, снова запустив grep, и логический OR
, используя регулярные выражения:
echo "$output" | grep "NXDOMAIN" | grep -E 'test1\.com|test2\.com'
Здесь нет необходимости в 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
может это сделать.