Баш
Здесь мы используем цикл while
для приема аргументов из стандартного ввода и НЕ выполняем разделения, поскольку мы используем IFS=
с read
. Это позволяет сохранить всю строку с сопутствующими пробелами. И, наконец, мы echo
timestamp
вместе с аргументами, которые теперь доступны через переменную $l
. Следует иметь в виду, что все аргументы для echo
должны быть заключены в кавычки для предсказуемого поведения кода.
echo 'foo bar baz' | while IFS= read -r l; do echo "$(date +'%s')" "$l"; done
Перл
Опция-n
предписывает Perl
читать строку файла -по строке -+ не печатать, если специально не попросят. Каждая прочитанная строка сохраняется в $_
, что эквивалентно $0
из awk
. time()
— это функция Perl
builtin
, дающая нам epoch
время. Затем мы помещаем время эпохи и текущую строку в ссылку на массив anonymous
[...,... ]
и возвращаем содержимое этого массива с помощью dereferencing
it, @{... }
Двойные кавычки "..."
вокруг выражения @{...}
гарантируют что элементы списка должны быть разделены пробелом. Затем мы их печатаем.
echo... | perl -ne 'print "@{[+time,$_]}"'
IFS= read -r l <<<"$(echo 'foo bar baz')"
printf '%d %s\n' "$(date +'%s')" "$l"
Мне очень интересно узнать, как можно использовать такую проверку.
В любом случае вы можете использовать команду iptables -S
, которая позволяет указать номер правила -.
Тогда это будет зависеть от того, где вам нужно использовать результат проверки.
Для примера вы могли бы, например, сделать:
iptables -S INPUT 1 | grep -ce '-j ACCEPT'
для получения 1
, напечатанногоgrep -c
(или 0
, если совпадений нет ).
Или в оболочке тест может выглядеть так:
[ "$(iptables -S INPUT 1)" = '-A INPUT -j ACCEPT' ]
при условии, что вы точно знаете правило, которое хотите проверить. В противном случае вы можете использовать тест [[
с оператором =~
, если ваша оболочка их поддерживает, для поиска регулярного выражения, соответствующего этому номеру правила -.
Анализ вывода iptables -L --line-numbers
не должен быть таким уж плохим:
num=3
if iptables -L foo --line-numbers | grep -qe "^$num "; then
echo "rule exists at line #$num"
else
echo "no rule at line #$num"
fi
Тем не менее, я не уверен, насколько это полезно, так как, например. удаление правил с начала цепочки изменяет номера других правил, поэтому они не работают как уникальные идентификаторы или что-то в этом роде. С тем же успехом вы могли бы взять количество правил в цепочке(iptables -L foo --line-numbers | sed -ne '$s/.*//p'
)и сравнить с ним.
В шутку можно было бежать iptables -D foo "$num"
. Жалуется, если по номеру $num
нет правила, но, конечно, тоже деструктивно...