понимание кода sed для обработки текста

Простое исправление существующего сценария:

#!/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/*
1
02.06.2017, 16:03
1 ответ

Хорошо, давайте пошагово:

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,\}

3
27.01.2020, 23:24

Теги

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