sed: удалить все, кроме последних X строк файла

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

11
задан Felipe Alvarez
12.11.2022 7:58 Количество просмотров материала 2487
Распечатать страницу

4 ответа

в основном вы подражаете хвост. X = 20 в данном примере. В следующем примере будут удалены все, кроме последних 20 строк:

sed -e :a -e '$q;N;21,$D;ba' filename

объяснение:

  • - э :создает ярлык называется
  • следующий-e:
    • $q - завершает работу и печатает пространство шаблона, если это последняя строка
    • N-следующая строка
    • 21,$д - выполняет "Д" командной если строку# это >= 21 (21,$ = 21 линия в $ Что конца file)
    • ba - ветви для метки 'a', которая является началом скрипта.
9
отвечен phiz 2022-11-13 15:46

sed довольно сложно, когда дело доходит до такой задачи, как эта. tail,grep или awk сделало бы это намного проще и должно использоваться вместо этого. Как говорится, it is возможно.

следующее решение адаптировано из sed и многострочный поиск и замена.

sed -ni '
    # if the first line copy the pattern to the hold buffer
    1h
    # if not the first line then append the pattern to the hold buffer
    1!H
    # if the last line then ...
    ${
            # copy from the hold to the pattern buffer
            g
            # delete current line if it is followed by at least X more lines
            # replace X-1 with the proper value
            s/.*\n\(\(.*\n\)\{X-1\}\)//
            # print
            p
    }
' filename

без комментариев, это делает отличный сценарий. Если вы хотите исключить, например, все, кроме последних десяти строк, используйте это:

sed -ni '1h;1!H;${;g;s/.*\n\(\(.*\n\)\{9\}\)//;p;}' filename
6
отвечен Dennis 2022-11-13 18:03

на основе скрипта раздел 4.13 руководства sed вы могли бы сделать что-то вроде этого:

n=10

(( n > 1 )) && script='1h; 2,'$n'{H;g;}; $q; 1,'$((n-1))'d; N; D'
(( n > 1 )) || script='$!d'

sed -i "$script" infile
2
отвечен Thor 2022-11-13 20:20

ТАС|СЭД|пиу>&&(МВ||кошка>)

оба из следующих фрагментов команды будет эффективно удалить все, кроме самого last 5 строки на ~/file1. Если вы хотите сохранить last 10 строки, можно заменить на: |sed '1,5!d;' С |sed '1,10!d;',и так далее, как вы считаете нужным.

  1. tac ~/"file1" |sed '1,5!d;' |tac >"/tmp/file2" &&mv  "/tmp/file2"  ~/"file1"
  2. tac ~/"file1" |sed '1,5!d;' |tac >"/tmp/file2" &&cat "/tmp/file2" >~/"file1"
0
отвечен tjt263 2022-11-13 22:37

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх