Вывод плоскости top
не подходит для отображения ни на чем кроме терминала. Необходимо использовать -b
переключатель для получения простого текста.
И конец символов строки собирается быть разделенным (замененный пробелами) Вашей оболочкой с тем, что Вы делаете - нет никакой причины для Вас сохранить те выводы в переменных, Вы могли просто выполнить те команды при необходимости в них.
Я предполагаю, что Вы возвращаете данные веб-браузеру. Если это действительно имеет место, необходимо сделать некоторое минимальное форматирование HTML, если Вы хотите шанс при отображении вывода правильно.
Попробуйте что-то как:
#! /bin/sh
echo -e "Content-type: text/html\n"
echo "<html><body>"
echo "<h1>top</h1>"
echo "<pre>"
top -b -n 1
echo "</pre>"
echo "<h1>ps</h1>"
echo "<pre>"
ps aux
echo "</pre>"
echo "</body></html>"
Односторонняя дорога:
awk 'NR==FNR{a[$0];next}$0 in a{printf "#";}1' fileB fileA
Объяснение:
NR==FNR{a[$0];next}
=> awk читает fileB в массив.
$0 in a{printf "#";}
=>, Если какая-либо строка fileA соответствует какому-либо содержанию массива, помещенному # в начале.
1
=> Печатают каждую строку fileA
Используя sed:
$ x=$(sed -e :a -e 'N;s/\n/\\|/;ta' FileB)
$ sed "s/$x/#&/" FileA
1-я команда sed готовит строку, где все строки объединены как строка и разграничены "|" и сохранены в $x. 2-й sed вставляет # в начале для соответствия строки любому из шаблонов, сохраненных в переменном $x.
Я смог сделать это со следующей остротой:
sed "$(for str in $(cat fileB); do echo -n "s/$str/#\0/; "; done;)" fileA
sed
команда создается в подоболочке цикличным выполнением по fileB. Это затем раньше заменяло согласующие отрезки длинной линии a #
и подобранная строка.