Хорошо, давайте пошагово:
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,\}
Должен работать с двойными кавычками, например
smbclient //10.10.101.29/it -W WORKGROUP -U user --password pass -c "put file_$(date +%Y_%m_%d).file"
или
date=$(date +%Y_%m_%d)
smbclient //10.10.101.29/it -W WORKGROUP -U user --password pass -c "put file_${date}.file"