printf '192.168.1.%d\n' {1..251}
Это будет использовать расширение фигурной скобки bash
(первоначально функция zsh
, также доступная в . ]ksh93
) для генерации чисел от 1 до 251, и для каждого числа printf
будет печатать IP-адрес с числом, вставленным в конце.
Следующее будет читать IP-адрес и делать с ним то же самое:
IFS='.' read a1 a2 a3 a4
printf -- "$a1.$a2.$a3.%d\n" {1..251}
Если вы хотите использовать awk
:
awk 'BEGIN { OFS = FS = "." } { for (i = 1; i <= 251; ++i) print $1, $2, $3, i }' <<<"$IP"
Мы хотим, чтобы разделитель полей ввода и вывода был точка, поэтому мы устанавливаем оба FS
и OFS
на этот символ в блоке BEGIN
. Затем мы считываем IP-адреса из стандартного ввода и для каждого IP-адреса выполняем итерацию от 1 до 251 и распечатываем список.
В командной строке мы вводим $IP
как «здесь-строку» (первоначально функция zsh
, но также доступна в bash
и ksh93
).
Оба способа имеют свои плюсы и минусы, как вы и Джули заметили. Но действительно лучшее решение — использовать их оба, когда это необходимо. Итак, когда вы не уверены в том, !!
приведет к
sudo !!
Есть и другие хитрости, касающиеся истории. Это из man bash
.
Event Designators
An event designator is a reference to a command line entry in the his‐
tory list. Unless the reference is absolute, events are relative to
the current position in the history list.
! Start a history substitution, except when followed by a blank,
newline, carriage return, = or ( (when the extglob shell option
is enabled using the shopt builtin).
!n Refer to command line n.
!-n Refer to the current command minus n.
!! Refer to the previous command. This is a synonym for `!-1'.
!string
Refer to the most recent command preceding the current position
in the history list starting with string.
!?string[?]
Refer to the most recent command preceding the current position
in the history list containing string. The trailing ? may be
omitted if string is followed immediately by a newline.
^string1^string2^
Quick substitution. Repeat the previous command, replacing
string1 with string2. Equivalent to ``!!:s/string1/string2/''
(see Modifiers below).
!# The entire command line typed so far.
Чтобы увидеть всю историю о расширении истории, перейдите на man bash
и найдите там раздел ИСТОРИЯ РАСШИРЕНИЯ.
Если вы только что набрали его и все еще видите, то я не понимаю, почему бы не использовать !!
но, конечно, не делайте этого вслепую и в конечном итоге не запускайте предыдущую операцию, которая может все испортить.
Я не могу представить много случаев, когда было бы опасно повторять последнюю команду таким образом, если только вы не выкурили что-то действительно крепкое.