Жесткие ссылки могут быть определены путем сравнения и inode числа и номера устройства (две различных смонтированных файловых системы могут каждый иметь файл с тем же inode числом, но у них будут различные номера устройств). Можно считать device/inode вручную с stat $file
, или find
может сделать это для Вас с -samefile
. Можно сделать поиск жестких ссылок более эффективным путем поиска только в том же устройстве:
find $fsroot/. -mount -samefile $myfile
Гибкие ссылки более тверды, поскольку они могут быть расположены где угодно. Необходимо разыменовать их для идентификации inode/device. Можно сделать это вручную с stat -L
или автоматически с find -L
:
find -L / -samefile $myfile
Обратите внимание, что это также найдет жесткие ссылки. Я не думаю find
имеет простой способ искать только гибкие ссылки, которые указывают на определенный inode.
Могло бы случиться так, что некоторые файловые системы могут сказать Вам эту информацию более эффективно, но я думаю в общем случае, необходимо просканировать каждый файл.
С Вашим исходным синтаксисом:
$ cat /tmp/foo.txt | awk -F@ '{print $2}'
1.2.3.4
Если можно использовать другой синтаксис для команды ssh, это легче get's:
ssh -l foo 1.2.3.4
echo !:3
но это требует этого точного синтаксиса.
Можно использовать !!
получить доступ к предыдущей командной строке так
echo !! | sed 's/.*@\(.*\).*/\1/' | awk '{print $1}'
может работать на Вас, например.
echo ssh user@123.456.654.321 ls | ...
123.456.654.321
echo ssh -p 19111 user@123.456.654.321 | ...
123.456.654.321
Единственное предположение здесь - то, что ipaddress будут предшествовать и что существует пространство или конец строки после него.
Когда у Вас был вывод печати в файл, я буду использовать Perl:
cat /tmp/foo.txt | \
perl -ne ' print $& if $_ =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)/'
Найти числовой IP-адрес от предыдущей команды ssh:
echo $(grep -oP '\d+\.\d+\.\d+\.\d+' <<< "!ssh")
Я ничего не вижу в руководстве, которое позволило бы Вам найти "аргумент, соответствующий шаблону" (http://www.gnu.org/software/bash/manual/bashref.html#History-Interaction)
Вполне уверенный Вы не можете поместить !
- расширения истории стиля в функции, но существует fc
команда:
# return the IP address of the most recent ssh command
sship () { command grep -oP '\d+\.\d+\.\d+\.\d+' < <(fc -l ssh); }
Это не вынудит Вас иметь IP-адрес как определенное (например, последнее) аргумент
ssh user@1.2.3.4 hostname
Нет никакой конструкции расширения истории для повреждения в @
. Однако последний аргумент предыдущей команды также доступен как переменная $_
.
ssh-keygen -R "${_##*@}"
Обратите внимание, что это только работает, если имя хоста было последним аргументом предыдущей команды: это не будет работать, если предыдущая команда была, например. ssh somehost ls
. Можно делать попытку парсинга вывода fc -ln -1
извлечь первый аргумент неопции.
Ваша цель кажется мне довольно плохой идеей. Редко должно удалить ключ хоста SSH — в основном это должно только произойти, если машина была переустановлена. Если необходимо часто делать это, что-то неправильно с методологией, или возможно с настройкой сети (удостоверьтесь, что клиенты DHCP получают восстанавливаемые IP-адреса, если Вы никогда не собираетесь соединяться с ними от другой машины).
cat
не нужно.awk -F@ '{print $2}' /tmp/foo.txt
делает то же без вызоваcat
– Valentin Bajrami 24.07.2013, 13:33