подражать хвост с сед

8

У меня есть мини-система с ограниченным числом двоичных файлов ( bash, cp, cat, sed, ...). У меня нет tailкоманды, и мне интересно, могу ли я подражать хвостовой функциональности сsed

cat foo.txt | tail -n 10

Я знаю, что могу печатать строки 1-10 с помощью sed cat foo.txt | sed -n '1,10p', но как мне распечатать последние 10 строк?

Мартин Вегтер
источник
2
В одной командной строке вам может понадобиться много полезных сценариев sed: sed в одну строку
Slyx

Ответы:

15

Вы могли бы сделать что-то вроде этого:

sed -e :a -e '$q;N;11,$D;ba'
Крис Даун
источник
sed -e :a -e '$q;N;11,$D;ba' fooчтобы соответствовать вопросу.
Сликс
Я понятия не имею, как это работает, но работает отлично. Большое спасибо.
Мартин Вегтер
Может ли кто-нибудь объяснить эту замечательную команду? Я ищу одну команду, которая показывает начало и конец документа, и я думаю, что эта команда может помочь, но мне нужно добавить часть заголовка . Фактически, команда, которую я искал, проста: sed -e '1,11p' -e :a -e '$q;N;11,$D;ba' но я все еще хотел бы понять хвостовую часть !!!
Франк
0
tac foo |  sed -n '1,10p' | tac

но если у вас нет tac, вы можете использовать только sed следующим образом:

sed -n '1!G;h;$p' foo | sed -n '1,10p' | sed -n '1!G;h;$p'
Slyx
источник
0

Является ли exprдоступна с вашей системой? Затем вы можете попытаться оценить желаемый номер строки после того, как подсчитали общее количество строк в файле.

Я создал файл с именем, tmpсодержащим цифры от 1 до 20 в каждой строке.

nlines=$(cat tmp | sed -n '$=')
cat tmp | sed -n $(expr $nlines - 9),"$nlines"p
11
12
13
14
15
16
17
18
19
20

Конечно, вы можете использовать wc -l, если доступно.

Команда для вычисления общего количества строк в файле взята из sed one liners . Тем не менее, я не проверял, работает ли он также с пустыми файлами.

PS Если exprнет, вы можете использовать числа вычитания в Bash, как показано ниже:

cat tmp | sed -n $((nlines-9)),"$nlines"p
Барун
источник