Отображение только предпоследней (второй последней) строки текста [дубликат]

Я обнаружил, что промывка IP-адреса eth* помогает, как в этом посте: https://ubuntuforums.org/showthread.php?t=2315062

т.е. sudo ip addr flush dev ethX

Возможно, нужно найти решение, которое сохраняется при перезагрузке системы

7
22.05.2018, 16:44
5 ответов

Предположим, что ваше стихотворение находится в текстовом документе poem:

< poem tail -n 2 | head -n 1
3
27.01.2020, 20:13

Есть много способов сделать это, но это самый быстрый --из тех, что я нашел, и, на мой взгляд, самый чистый.

Предполагая, что стихотворение записано в файле с именем poem, вы можете использовать:

tail -n 2 poem | head -n 1

tail -n 2 poemзапишет последние 2 строки файла poem.

head -n 1запишет первую строку вывода, предоставленного предыдущей командой tail.

19
27.01.2020, 20:13

Вы бы сделали

sed '2q;d' <(tac infile)

tacраспечатайте файл infileв обратном порядке, в отличие от cat, и передайте его в качестве входных данных в sed, и это удалит каждую строку (здесь, только первую строку ), кроме второй, а затем немедленно завершите работу.

или альтернативно:

tail -n2 infile | sed '2d'

Или только с sed

sed 'x;$!d' <infile

sedчитает по одной строке за раз и удерживая -пробел xмы сохраняем текущую обработку строки и распечатываем ее!d(не удалять )один раз sed читать все строки (или в последней строке )и поскольку sed может иметь только один пробел -, поэтому, когда это последняя строка, пробел -содержит предпоследний линия; это то же самое, что и:

sed -n 'x;$p' <infile
5
27.01.2020, 20:13

Используй ред, чувак!

ed -s poems <<< $'$-1\n'

Это говорит ed открыть файл poemsв режиме сценария (-s)(, чтобы он не печатал лишних сообщений ), а затем отправляет адресную команду в строке здесь -, которая говорит: «перейти к последняя строка файла ($), минус 1", которая печатает эту строку.

Учитывая исходный файл стихотворения из:

A is for awk, which runs like a snail, and
B is for biff, which reads all your mail.

C is for cc, as hackers recall, while
D is for dd, the command that does all.

E is for emacs, which rebinds your keys, and
F is for fsck, which rebuilds your trees.

G is for grep, a clever detective, while
H is for halt, which may seem defective.

I is for indent, which rarely amuses, and
J is for join, which nobody uses.

K is for kill, which makes you the boss, while
L is for lex, which is missing from DOS.

M is for more, from which Less was begot, and
N is for nice, which it really is not.

O is for od, which prints out things nice, while
P is for passwd, which reads in strings twice.

Q is for quota, a Berkeley-type fable, and
R is for ranlib, for sorting ar sic table.

S is for spell, which attempts to belittle, while
T is for true, which does very little.

U is for uniq, which is used after Sort, and
V is for vi, which is hard to abort.

W is for whoami, which tells you your name, while
X is, well, X, of dubious fame.

Y is for yes, which makes an impression, and
Z is for zcat, which handles compression.

... вывод результата:

Y is for yes, which makes an impression, and
7
27.01.2020, 20:13

авк

Это работает с GNU awk (Linux )и BSD awk (Mac ).

Вы можете игнорировать пустые строки. В этом случае вы можете использовать awk 'NF' file.txt, а затем направить вывод с помощью одного из других методов, описанных на этой странице.

Вы также можете сделать все это за один проход через awk:

awk 'NF { a=b ; b=$0 } END { print a }' file.txt
  • NF
    Обрабатывать только те строки, которые содержат данные. NF— количество полей в строке; значения больше 0 рассматриваются как «истинные».
    • { a=b ; b=$0 }
      Сохранить текущую не-пустую строку как b, а предыдущую не-пустую строку как a.
  • END { print a }
    После проверки всего файла выведите окончательное значениеa(предпоследней не-пустой строки ).

Если вы не хотите пропускать пустые строки, просто удалитеNF:

awk '{ a=b ; b=$0 } END { print a }' file.txt
2
27.01.2020, 20:13

Теги

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