У меня есть (большой) файл, в котором многократно встречается выражение SCF Done и меня (пока) интересует только последняя из этих строк. В настоящее время я использую команду piped:

sed -n '/SCF Done/p' <filename> | sed '$!d'

Я хотел бы заменить эту команду, комбинируя ее как-то, но я пока не смог этого сделать. В частности, я хочу, чтобы <filename> было последним. Есть способ сделать это?

Хотя я бы предпочел решение с помощью sed, я открыт для других инструментов командной строки.

2 ответа2

2

В общем, каждая команда sed работает из одних и тех же исходных данных, и они не видят изменений друг друга. Это не проблема, когда вы используете оболочку для передачи данных. Если вы не хотите использовать оболочку для конвейерного вывода, вы должны использовать буфер удержания.

Это должно делать то, что вы хотите, хотя:

 sed '/SCF Done/h;g;$!d' <filename>

Это помещает каждое совпадение в буфер удержания (h). Затем, после чтения всего файла, он читает буфер удержания (g) и печатает только последнюю строку ($!d)

Я думаю, что это можно было бы оптимизировать, если бы вы могли выяснить, как заставить его действительно заменить весь буфер на каждом механизме, но я оставил это как упражнение для вас. Это также позволит вам избавиться от ;$!d часть.

-1

Чтобы напечатать только последние строки, передайте их через tail -n num_lines

Например, чтобы получить только последнюю строку

sed -n '/SCF Done/p' <filename> | sed '$!d' | tail -n 1

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .