grep
не тот инструмент для этого. Вы можете использовать его как
# Get line count
count=$(wc -l <file)
# Subtract one
penultimate=$(expr $count - 1)
# Delete that line, i.e. print all other lines.
# This doesn't modify the file, just prints
# the requested lines to standard output.
sed "${penultimate}d" file
Bash имеет встроенные арифметические операторы, которые более элегантны, чем expr
; но expr
переносим на другие оболочки.
Вы также можете сделать это в чистом виде sed
, но я не хочу об этом думать. В Perl или awk было бы легко напечатать предыдущую строку, а затем в EOF вывести последнюю строку.
Редактировать: Я думал о sed
в конце концов.
sed -n '$!x;1!p' file
Более подробно; если мы не на последней строке ($
), поменяйте пространство образца и пространство удержания (запомните текущую строку; получите предыдущую строку, если есть). Затем, если только это не первая строка, выведите все, что сейчас находится в пространстве шаблона (предыдущую строку, кроме случаев, когда мы находимся на последней строке).