Преобразуйте вывод сценария оболочки к .csv

Я хочу преобразовать вывод ниже patchhistory.sh сценария оболочки к csv, так, чтобы я мог получить информацию в формате столбца как это:

servername              patch history                            uptime
1.test-tch008.test.com  rsyslog Mon 16 Jul 2018 04:36:50 AM EDT  02:18:20 up 953 days,  8:16,  1 user,  load average: 0.08, 0.06, 0.08
[root@test-ops002 tmp]# ./patchhistory.sh

test-tch008.test.com
rsyslog                                  Mon 16 Jul 2018 04:36:50 AM EDT
 02:18:20 up 953 days,  8:16,  1 user,  load average: 0.08, 0.06, 0.08
Connection to test-tch008 closed.
test-twh005.test.com
rsyslog                                  Mon 16 Jul 2018 04:37:08 AM EDT
 02:18:21 up 1750 days, 13:38,  1 user,  load average: 0.07, 0.14, 0.17
Connection to test-twh005 closed.
test-vch108.test.com
rsyslog                                  Mon 16 Jul 2018 04:38:55 AM EDT
 02:18:23 up 94 days,  1:33,  1 user,  load average: 0.30, 0.28, 0.27
Connection to test-vch108 closed.
test-vch109.test.com
rsyslog                                  Mon 16 Jul 2018 04:39:03 AM EDT
 02:18:25 up 31 days,  1:22,  1 user,  load average: 0.18, 0.10, 0.08
Connection to test-vch109 closed.
test-vch110.test.com
rsyslog                                  Mon 16 Jul 2018 04:39:58 AM EDT
 02:18:26 up 31 days,  1:03,  1 user,  load average: 0.14, 0.21, 0.09
Connection to test-vch110 closed.
test-vwh114.test.com
rsyslog                                  Mon 16 Jul 2018 04:45:18 AM EDT
 02:18:28 up 84 days,  5:06,  1 user,  load average: 0.22, 0.19, 0.12
Connection to test-vwh114 closed.
test-vwh115.test.com
rsyslog                                  Mon 16 Jul 2018 04:46:10 AM EDT
 02:18:30 up 12 days,  4:27,  1 user,  load average: 0.13, 0.16, 0.11
Connection to test-vwh115 closed.
test-vwh116.test.com
rsyslog                                  Mon 16 Jul 2018 04:46:17 AM EDT
 02:18:32 up 84 days,  6:09,  1 user,  load average: 0.10, 0.16, 0.23
Connection to test-vwh116 closed.
test-vwh117.test.com
rsyslog                                  Mon 16 Jul 2018 04:46:26 AM EDT
 02:18:33 up 29 days, 14:31,  2 users,  load average: 0.32, 0.19, 0.19
Connection to test-vwh117 closed.
test-vxh104.test.com
rsyslog                                  Mon 16 Jul 2018 04:49:11 AM EDT
 02:18:35 up 953 days,  9:02,  2 users,  load average: 0.06, 0.03, 0.00
Connection to test-vxh104 closed.
0
задан 14 November 2018 в 08:18

1 ответ

Ну, похож, мы можем сделать это с sed :)

Это смотрит хорошо мне (продвижение | я предполагающий, что Вы будете передавать вывод по каналу своего сценария в команду):

| sed -r '/test/ N;N;N; s/(.*)\n([A-Za-z]*)\s*(.*)\n(.*)\n.*/\1  \2 \3  \4/'
test-tch008.test.com  rsyslog Mon 16 Jul 2018 04:36:50 AM EDT   02:18:20 up 953 days,  8:16,  1 user,  load average: 0.08, 0.06, 0.08
test-twh005.test.com  rsyslog Mon 16 Jul 2018 04:37:08 AM EDT   02:18:21 up 1750 days, 13:38,  1 user,  load average: 0.07, 0.14, 0.17
test-vch108.test.com  rsyslog Mon 16 Jul 2018 04:38:55 AM EDT   02:18:23 up 94 days,  1:33,  1 user,  load average: 0.30, 0.28, 0.27
test-vch109.test.com  rsyslog Mon 16 Jul 2018 04:39:03 AM EDT   02:18:25 up 31 days,  1:22,  1 user,  load average: 0.18, 0.10, 0.08

Но если Вы хотите вставить ту строку заголовка... хорошо я могу только думать об этом ужасном пути...

| sed -r '1 s/^/servername            patch history                             uptime\n/; /test/ N;N;N; s/(.*)\n([A-Za-z]*)\s*(.*)\n(.*)\n.*/\1  \2 \3  \4/'
servername            patch history                             uptime
test-tch008.test.com  rsyslog Mon 16 Jul 2018 04:36:50 AM EDT   02:18:20 up 953 days,  8:16,  1 user,  load average: 0.08, 0.06, 0.08
test-twh005.test.com  rsyslog Mon 16 Jul 2018 04:37:08 AM EDT   02:18:21 up 1750 days, 13:38,  1 user,  load average: 0.07, 0.14, 0.17
test-vch108.test.com  rsyslog Mon 16 Jul 2018 04:38:55 AM EDT   02:18:23 up 94 days,  1:33,  1 user,  load average: 0.30, 0.28, 0.27
test-vch109.test.com  rsyslog Mon 16 Jul 2018 04:39:03 AM EDT   02:18:25 up 31 days,  1:22,  1 user,  load average: 0.18, 0.10, 0.08

Объяснение

  • -r Используйте расширенный regex - сохраняет несколько обратных косых черт
  • s/old/new/ замена old с new
  • 1 s/^/literally what I want to insert\n/ замените запуск первой строки с Вашей строкой заголовка, заканчивающейся новой строкой. К счастью, sed интерпретирует \n как новая строка в этом контексте.
  • /test/ найдите строку с test
  • N;N;N считайте следующие три строки в также, таким образом, мы можем использовать \n в regex и процессе все три строки
  • (.*) сохраните любое количество любых символов (сохраните целую строку),
  • ([A-Za-z]) сохраните набор букв (это rsyslog, таким образом, Вы могли просто записать rsyslog если это всегда - то же).
  • \s горизонтальный пробел
  • \1 \2 \3 \4 Сохраненные шаблоны, с корректным интервалом.
1
ответ дан 27 October 2019 в 04:00

Другие вопросы по тегам:

Похожие вопросы: