"Эффективное программирование AWK" мне очень помогло.
awk работает по правилам, правила состоят из одного шаблона и одного действия, вы можете опустить любое из них, но не оба. BEGIN и END — шаблон, {...} — действие. действие будет выполнено, если оно не имеет шаблона или соответствует шаблону.
awk 'BEGIN {FS=OFS=","} {print $1}'
^pattern + ^action ^ action without pattern
awk '{ FS = "," } ; { print $1 }'
^action without pattern ^ another action without pattern
В обычной программе awk:
Я нашел рабочий метод. Это немного некрасиво, но это работает. Это использует директиву ProxyCommand
(см. справочную страницу)в сочетании с небольшим вспомогательным сценарием bash.
Match final host="!*.corp.foo.com,*.foo.com"
ProxyCommand ssh_ext2int %h %p
Match final host="*.quux.biz"
ProxyCommand ssh_ext2int %h %p
$PATH
где-нибудь как ssh _ext2int — и chmod u+x
это:#!/usr/bin/env bash
[ $# -eq 2 ] || exit 1
typeset -A dmap
dmap=(
[foo.com]=corp.foo.com
[quux.biz]=internal.qux.lan
)
d=${1#*.}
h=${1%%.*}
nd=${dmap[$d]:-$d}
/usr/bin/nc -w 120 $h.$nd $2 2>/dev/null
Теперь ssh server158247.quux.biz
должен соединить вас сserver158247.internal.qux.lan
Эта конкретная вещь, о которой вы просите, невозможна с OpenSSH. Эти конструкции действительно предназначены только для простых псевдонимов, а не для сложных замен, как вы просите. Если эти серверы имеют какой-то определенный формат, вы можете сделать их псевдонимами (без имени домена):
Host server*
Hostname %h.internal.foo.bar
Если вам нужны более сложные совпадения для псевдонимов, (скажем, у вас есть файл, содержащий все ваши хосты. Это может быть либо создано вручную, либо автоматически обновлено из DNS ), вы можете использовать что-то вроде этого
Match exec "grep %h %d/.ssh/internal_hosts"
Hostname %h.internal.foo.bar
В крайнем случае сгенерируйте конфигурацию ssh _из приведенного выше списка/DNS, которая будет иметь все жестко закодированные элементы для всех ваших хостов. Это не обязательно должен быть основной файл конфигурации, а просто какой-то включенный. Файлы конфигурации - это просто текстовые файлы.