Вопрос или проблема
В основном, у меня есть набор команд bash, которые запрашивают информацию о моем компьютере.
Например:
> host=$(hostname -A)
hostname=$(hostname -I)
Pub_IP=$(dig +short myip.opendns.com @resolver1.opendns.com)
Kernel_Version=$(uname -v | awk -F"Debian" '{print $2}' | cut -d ' ' -f2 | cut -d '-' -f1)
Deb_Version=$(cat /etc/debian_version)
Я также выводил это на экран
echo $host $hostname $Pub_IP $Kernel_Version $Deb_Version > info.txt
Что мне нужно выяснить, так это как я могу поставить |
между каждым из параметров. Так что, если я открою свой файл info.txt, он будет выглядеть примерно так
| debianmachine | output_of_hostname | output_of_Pub_IP |
Кроме того, я могу сделать это с помощью print?
Если вы заключите строки в кавычки или экранируете их, вы можете включить пайпы:
echo "| ${host} | ${hostname} ..."
Конечно, вы также можете использовать printf
(я так понимаю, что именно это вы имеете в виду в конце вашего вопроса):
printf '| %s | %s | %s ...' "${host}" "${hostname}" "${Pub_IP}" ...
Вы можете воспользоваться повторяющимся поведением printf
, чтобы упростить строку формата:
printf '| %s ' "${host}" "${hostname}" "${Pub_IP}" ...; printf '|\n'
Это повторит последовательность | %s
столько раз, сколько необходимо, и закончит строку пайпом и возвратом каретки.
Используйте printf
:
printf '| %s | %s | %s | %s | %s |\n' "$host" "$hostname" "$Pub_IP" "$Kernel_Version" "$Deb_Version" >info.txt
%s
в строке формата printf
(первый аргумент для printf
) — это зам placeholders для строк, и каждый из них будет заменен другими аргументами, переданными printf
, по очереди.
Одна из идей может заключаться в том, чтобы сохранить все переменные в массив и распечатать их с необходимыми модификациями в цикле.
Хотя, я думаю, более эффективно и просто будет конкатенация строк в shell, например:
echo "| $host | $hostname | $Pub_IP | $Kernel_Version | $Deb_Version |" > info.txt
Другой способ — использовать простой цикл awk для поэтапного создания содержимого файла, например:
awk '{print "|" \
for (i=1 ; i <= NF ; i++) \
print " ", $i, " |"}' \
info.txt | xargs -11 > temp.txt && mv temp.txt info.txt
Ответ или решение
Для того чтобы вывести информацию о вашем компьютере с разделителями в виде «|» в файле info.txt
, можно использовать несколько простых подходов. Я перечислю наиболее актуальные методы.
Метод 1: Использование echo
Вы можете создать строку, содержащую все данные с разделителями, и вывести ее в файл с помощью команды echo
. Например:
host=$(hostname -A)
hostname=$(hostname -I)
Pub_IP=$(dig +short myip.opendns.com @resolver1.opendns.com)
Kernel_Version=$(uname -v | awk -F"Debian" '{print $2}' | cut -d ' ' -f2 | cut -d '-' -f1)
Deb_Version=$(cat /etc/debian_version)
echo "| $host | $hostname | $Pub_IP | $Kernel_Version | $Deb_Version |" > info.txt
Этот код будет записывать в файл info.txt
строку с вашими данными, разделенными вертикальными чертами.
Метод 2: Использование printf
Команда printf
позволяет более точно контролировать формат вывода. Вот как это можно сделать:
host=$(hostname -A)
hostname=$(hostname -I)
Pub_IP=$(dig +short myip.opendns.com @resolver1.opendns.com)
Kernel_Version=$(uname -v | awk -F"Debian" '{print $2}' | cut -d ' ' -f2 | cut -d '-' -f1)
Deb_Version=$(cat /etc/debian_version)
printf '| %s | %s | %s | %s | %s |\n' "$host" "$hostname" "$Pub_IP" "$Kernel_Version" "$Deb_Version" > info.txt
Здесь %s
является заполнительным элементом для строк, которые будут заменены значениями ваших переменных.
Метод 3: Использование массива
Если вы хотите сделать код более динамичным, можно хранить ваши переменные в массиве и затем их выводить. Вот пример:
info=("$host" "$hostname" "$Pub_IP" "$Kernel_Version" "$Deb_Version")
output=""
for value in "${info[@]}"; do
output+="| $value "
done
output+="|"
echo "$output" > info.txt
Вывод
Существует несколько способов вывода информации с разделителями в bash
. Вы можете выбрать любой из описанных методов в зависимости от ваших предпочтений и задач. Для простоты и удобочитаемости чаще всего используют первый или второй способы.
Надеюсь, это помогло вам решить вашу задачу! Если у вас есть дополнительные вопросы, не стесняйтесь задавать.