Мультилиния grep beween два тега, только покажите последнее соответствие

Если Вы используете sh (или bash), Вы используете read с опцией -s (безопасный).

read -s pass

считает пароль от пользователя, не показывая его выводу и сохранит его к переменной pass.

4
20.10.2013, 05:56
5 ответов

С awk начните накапливать данные после маркера запуска и остановки при обнаружении с маркером конца. Повторно инициализируйте аккумулятор данных при обнаружении с новым маркером запуска.

awk '
    /-BEGIN INLINE DATA-/ {data = ""; storing = 1}
    /-END INLINE DATA-/ {storing = 0}
    storing {data = data "\n" $0}
    END {print data}
'
2
27.01.2020, 20:58
tac log.txt | sed '1,/END INLINE DATA/d' | sed '/BEGIN INLINE DATA/,$d' | tac

кажется, делает задание

0
27.01.2020, 20:58
  • 1
    я предполагаю это, взят из ответа Karol. Если ответ помог Вам, корректный способ указать, что это должно отметить его, как принято (используйте поле галочки ниже голосующих маркеров рядом с вопросом). Обратите внимание на то, что Формат обмена Стека отличается от стандартных форумов. –  Joseph R. 20.10.2013, 22:38

Можно передать два семени по каналу как это:

<your program> | tac | sed '1,/END INLINE DATA/d' | sed '/BEGIN INLINE DATA/,$d' | tac
1
27.01.2020, 20:58
  • 1
    , но это только распечатает одну строку –  awkward_grep 20.10.2013, 06:07
  • 2
    Извините, я неправильно читал. Просто опустите хвост в конце, и он должен выбрать первый блок данных. –  Karol 20.10.2013, 06:20
  • 3
    Понятное дело Вы хотите последний блок. Просто используйте tac прежде и после семян. –  Karol 20.10.2013, 06:27

Можно использовать эту команду для получения то, что Вы хотите:

$ 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
0
27.01.2020, 20:58
  • 1
    Но OP не хочет последнюю строку, он хочет последний блок данных. –  Joseph R. 20.10.2013, 22:38
  • 2
    @JosephR. - да вот почему я попросил, чтобы он добавил пример "данных" segment/line/whatever, это так, мы могли удостовериться, что наши решения были склонны. –  slm♦ 20.10.2013, 22:50

Вот довольно неортодоксальный способ сделать его в 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
0
27.01.2020, 20:58

Теги

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