Простое исправление существующего сценария:
#!/bin/bash
# set location of backup such as `/var/log`
envDir=/path/to/dir
mkdir -p $envDir/junk
mv $envDir/env.*.txt $envDir/junk 2> /dev/null
time=$(date +"%Y%m%d%H%M%S")
echo $(hostname) >> $envDir/env.$time.txt
echo date:$time >> $envDir/env.$time.txt
echo $(env)>>$envDir/env.$time.txt
cat $envDir/env.$time.txt
rm $envDir/junk/*
Обратите внимание, что некоторые вещи можно улучшить, например, ваш echo $ (env)
, который будет создавать практически непригодные для использования данные. Вместо этого вы должны просто сделать это как env
, который будет разделен на строки и легко импортируется.
Имя файла также можно определить раньше, чтобы упростить код, например настройку, и сделать его более удобным в сопровождении.
Вот немного улучшенная версия с дополнительными комментариями:
#!/bin/bash
# set location of backup such as `/var/log`
# !!! Update this!
envDir=/path/to/dir
# set backup time
time=$(date +"%Y%m%d%H%M%S")
# set full file name for the backup
envFile=$envDir/env.$time.txt
# make temporary directory and ignore if it already exists
mkdir -p $envDir/junk
# move existing environment backup files to junk until we have our new output
mv $envDir/env.*.txt $envDir/junk 2> /dev/null
hostname >> $envFile
echo date:$time >> $envFile
env >> $envFile
cat $envFile
# remove the backup(s)
rm $envDir/junk/*
Хорошо, давайте пошагово:
sed -n '
Опция -n
заставляет sed
ничего не выводить, если не указано иное
/Policy Name:/! d
Все строки, не содержащие Policy name:
, удаляются. Остальная часть скрипта обрабатывается только в следующих циклах.
s/.*:\s\+//
h
При этом удаляется все до :
и завершающих пробелов, а остальное помещается в буфер хранения для последующего использования.
:1
n
Это начало цикла чтения новых строк
/Active:\s*no/d
Строки с таким паттерном удалены, поэтому очевидно, что неактивные не интересны
/HW\//!b1
И теперь мы переходим к :1
, если строка не содержитHW/
:2
s/.*\s\(\S*\)\s*/\1/
Начало следующего цикла, удалить все, кроме последней последовательности не -пробелов.
G
s/\n/\t/p
Затем добавьте имя политики, хранящееся в буфере хранения, разделенное табуляцией, и распечатайте эту строку
n
/^\s*$\|Include:/! b2
'
и это повторяется со следующими строками, пока мы не достигнем заданного шаблона.
Обратите внимание, что это крайне -непереносимый код, который не будет работать во многих sed
версиях.
Редактировать:Чтобы добавить тип политики в качестве третьего столбца, вы должны добавить эту строку в скрипт до или после Active:
флажка:
/Policy Type:/{s/.*:\s*//;H;}
То есть :Если строка содержит указанную строку, выполните команды между {}
. Эти команды удаляют часть до :
и завершающие пробелы и добавляют оставшуюся часть строки (, которая должна содержать тип политики ), в буфер удержания. Таким образом, буфер хранения содержит имя и тип политики, разделенные новой строкой. Поэтому, когда мы добавим это с G
, будут заменены две новые строки, поэтому команда замены должна получить флаг g
для замены всех вхождений:
s/\n/\t/gp
Сценарий AIX в основном такой же, но в нем отсутствуют расширения GNU для регулярных выражений. В основном используются переменные для сопоставления пробелов или вкладок,поскольку \t
не будет работать во всех вариантах sed
, а также +
для «одного или нескольких» необходимо заменить на\{1,\}