Как считать первую и последнюю строку из вывода кошки?

Существует много различных путей к этому. Можно принять решение установить использование мультиначальной загрузки:

  1. Grub2. Следуйте инструкциям отсюда.
  2. Мультисистема. Следуйте инструкциям отсюда.

Инструкции для grub2 достаточно просты следовать. Как дали там, добавление не включенной в список ОС потребовало бы, чтобы Вы отредактировали запись меню для что ОС в '/boot/grub/grub.cfg'.

65
29.05.2015, 12:54
7 ответов

sed Решение:

sed -e 1b -e '$!d' file

При чтении из stdin если бы оно выглядело так (например ps -ef):

ps -ef | sed -e 1b -e '$!d'
UID        PID  PPID  C STIME TTY          TIME CMD
root      1931  1837  0 20:05 pts/0    00:00:00 sed -e 1b -e $!d

head & tail Solution:

(head -n1 && tail -n1) <file

Когда данные поступают от команды (ps -ef):

ps -ef 2>&1 | (head -n1 && tail -n1)
UID        PID  PPID  C STIME TTY          TIME CMD
root      2068  1837  0 20:13 pts/0    00:00:00 -bash

awk Решение:

awk 'NR==1; END{print}' file

А также пример с трубопроводом с ps -ef:

ps -ef | awk 'NR==1; END{print}'
UID        PID  PPID  C STIME TTY          TIME CMD
root      1935  1837  0 20:07 pts/0    00:00:00 awk NR==1; END{print}
119
27.01.2020, 19:32

sed -n '1p;$p' file.txt выведет 1-ю и последнюю строку file.txt .

.
23
27.01.2020, 19:32

Забавный чистый Bash≥4 способ:

cb() { (($1-1>0)) && unset "ary[$1-1]"; }
mapfile -t -C cb -c 1 ary < file

После этого у вас будет массив ary с первым полем (т.е, где индекс 0) является первой строкой файла ary, а его последнее поле - последней строкой файла ary. Обратный вызов cb (опционально, если вы хотите перекрыть все строки в массиве) сбрасывает все промежуточные строки, чтобы не загромождать память. В качестве свободного побочного продукта в файле также будет указано количество строк (как последний индекс массива+1).

Demo:

$ mapfile -t -C cb -c 1 ary < <(printf '%s\n' {a..z})
$ declare -p ary
declare -a ary='([0]="a" [25]="z")'
$ # With only one line
$ mapfile -t -C cb -c 1 ary < <(printf '%s\n' "only one line")
$ declare -p ary
declare -a ary='([0]="only one line")'
$ # With an empty file
$ mapfile -t -C cb -c 1 ary < <(:)
declare -a ary='()'
10
27.01.2020, 19:32

Без кошки:

$ cat file |tee >(head -n1) >(tail -n1) >/dev/null
1
5

или

$ (head -n1 file;tail -n1 file)
1
5
4
27.01.2020, 19:32

Используя Perl:

$ seq 10 |  perl -ne 'print if 1..1 or eof'
1
10

, вышеприведенный отпечатает первый элемент в выходном отверстии seq 10 через , если 1...1, в то время как или eof также отпечатает последний элемент.

6
27.01.2020, 19:32
$ seq 100 | { IFS= read -r first; echo "$first"; tail -1; }
1
100
.
4
27.01.2020, 19:32

С помощью sed вы можете delete строк, если NOT 1st one AND NOT la$t единица.
Используй ! - НЕ (отрицать) условие и X{Y... } для объединения X И Y условий:

cmd | sed '1!{$!d;}'

или вы можете использовать диапазон - от 2и до la$t - и удалить все строки в этом диапазоне, кроме la$t строки:

cmd | sed '2,${$!d;}'
7
27.01.2020, 19:32

Теги

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