Надеюсь, это поможет.
local_root=/var/www/ftp/$USER
user_sub_token=$USER
Вы можете использовать awk
для цели:
awk 'BEGIN{RS="!\n";FS=OFS="\n"}
{for (i=i;i<=NF;i++) {if ($i~/^ *(shutdown|switchport access vlan [[:digit:]]+|switchport mode access) *$/) next}}
NF' cisco.txt
Это будет обрабатывать строки с !
как разделитель записей и считывать весь «абзац», связанный с одним интерфейсом за раз. Запись будет разбита на «поля» построчно, т.е. одна строка интерпретируется как одно «поле».
Затем программа перебирает все поля и, если какой-либо из ваших шаблонов найден, пропускает выполнение до следующей записи. Если ни одно из ключевых слов не найдено, и хотя бы одна строка в абзаце(NF
не равна -нулю; это сделано для предотвращения вывода пустых записей ), абзац печатается. Для вашего примера:
user@host~$ awk 'BEGIN{RS="!\n";FS=OFS="\n"} {for (i=i;i<=NF;i++) {if ($i~/^ *(shutdown|switchport access vlan [[:digit:]]+|switchport mode access) *$/) next}} NF' cisco.txt
interface FastEthernet0/4
Если вы хотите убедиться, что печатаете только строку, содержащую оператор interface
, измените NF
на
NF {print $1}
или даже более избирательно
NF && $1~/interface/ {print $1}
Обновление
Второй пример, который вы разместили в своем обновлении, использует другой формат файла (разделитель теперь изменен, и могут быть разделы, отличные от interface
), поэтому предложенное выше решение там не работает. Вместо этого попробуйте следующее:
awk 'BEGIN{RS="";FS=OFS="\n"}
{for (i=i;i<=NF;i++) {if ($i~/^ *(switchport mode trunk|switchport mode access|switchport access vlan ) *$/) next}}
NF && $1~/interface/ {print $1}' cisco2.txt
Это устанавливает разделитель записей на пустую строку, но в остальном работает так же, как и выше. Однако вывод производится только в том случае, если раздел начинается с interface
(, чтобы исключить строку hostname
, например. )и снова ()напечатает только первую строку, содержащую оператор interface
.