В зависимости от размера файла вы можете просто использовать grep
:
grep -Fxf A B
-f
указывает файл, из которого нужно получить список шаблонов.
-x
означает соответствие только всей строке (запретить соответствие части строки).
-F
означает обрабатывать шаблоны как фиксированные строки, а не как регулярные выражения.
Если B
меньше, чем A
, вы можете получить немного более быстрые результаты, указав B
в качестве файла шаблона ( grep -Fxf BA
]).
Вы можете направить вывод в sort -u
, чтобы получить отсортированный список отдельных строк, которые встречаются в каждом файле:
grep -Fxf A B | sort -u
Конечно, если ваша проблема заключается в окончании строки возврата каретки, вы должны использовать Сначала dos2unix
.
Используйте аутентификацию с закрытым ключом ssh, если можете :после того, как вы настроите ее, вам не нужно об этом думать. Также вам не нужно хранить пароль в виде обычного текста.
Кроме того, код намного сложнее:
#!/usr/bin/expect -f
set server_list /tmp/DR.txt
set fh_hosts [open $server_list r]
# truncate the log file
set log_file /tmp/space_utilization.log
close [open $log_file w]
set pass "Abcd@123"
set prompt_re {\$ $}
while {[gets $fh host] != -1} {
spawn ssh -q $host
expect "assword:"
send "$pass\r"
expect -re $prompt
set cmd "df -kh"
send "$cmd\r"
expect -re "$cmd\r\n(.*)\r\n$prompt"
log_file $log_file
send_log "\n"
send_log "====Space utilization for server $host at [timestamp -format +"%Y-%m-%d %T"]===\n"
send_log -- $expect_out(1,string)
send_log "\n\n"
log_file
send "exit\r"
expect eof
}
close $fh_hosts
Обязательно ли использовать expect? Можете ли вы просто иметь простую оболочку bash, которая удаленно запускает команду df через ssh и собирает информацию в один файл?
Если ключи ssh настроены правильно от вызывающего сервера ко всем серверам в вашем файле конфигурации, вам не нужно вводить никаких паролей. Следующий цикл соберет выходные данные df со всех серверов
while read -r h; do
echo "=== Space utilization for ${h} ==="
ssh "$h" df -kh
echo ""
done </tmp/DR.txt >/tmp/space_utilization.log