Если Вы используете sh
(или bash
), Вы используете read
с опцией -s
(безопасный).
read -s pass
считает пароль от пользователя, не показывая его выводу и сохранит его к переменной pass
.
С awk начните накапливать данные после маркера запуска и остановки при обнаружении с маркером конца. Повторно инициализируйте аккумулятор данных при обнаружении с новым маркером запуска.
awk '
/-BEGIN INLINE DATA-/ {data = ""; storing = 1}
/-END INLINE DATA-/ {storing = 0}
storing {data = data "\n" $0}
END {print data}
'
tac log.txt | sed '1,/END INLINE DATA/d' | sed '/BEGIN INLINE DATA/,$d' | tac
кажется, делает задание
Можно передать два семени по каналу как это:
<your program> | tac | sed '1,/END INLINE DATA/d' | sed '/BEGIN INLINE DATA/,$d' | tac
Можно использовать эту команду для получения то, что Вы хотите:
$ sed -n '/BEGIN/,/END/p' < data.txt | sed '1d;$d' | tail -1
data
sed
управляйте печатает все строки (включительно) между строками КОНЦА и НАЧИНАНИЕМ. 2-е sed
команда обрубает первые и последние строки, в то время как tail
управляйте возвращает последнюю строку.
Вы могли легко использовать Ваш awk
строка также:
$ awk '/-BEGIN INLINE DATA-/,/-END INLINE DATA-/' data.txt | sed '1d;$d' | tail -1
data
Вот довольно неортодоксальный способ сделать его в Perl:
perl -ne '
BEGIN{ $/="----BEGIN INLINE DATA----\n" } # Set input record separator
$payload= s/----END INLINE DATA----.*\z//rs; # Remove end marker and messages
END{ print $payload } # Print the last payload
' file
Этому нужен Perl v5.14 или выше. Если Вы застрянете с более старой версией Perl, то Вам будет нужна дополнительная строка:
perl -ne '
BEGIN{ $/="----BEGIN INLINE DATA----\n" } # Set input record separator
$payload= $_; # Copy current line into $payload
$payload=~ s/----END INLINE DATA----.*\z//s; # Remove end marker and messages
END{ print $payload } # Print the last payload
' file