Существует много различных путей к этому. Можно принять решение установить использование мультиначальной загрузки:
Инструкции для grub2 достаточно просты следовать. Как дали там, добавление не включенной в список ОС потребовало бы, чтобы Вы отредактировали запись меню для что ОС в '/boot/grub/grub.cfg'.
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}
Забавный чистый 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='()'
Без кошки:
$ cat file |tee >(head -n1) >(tail -n1) >/dev/null
1
5
или
$ (head -n1 file;tail -n1 file)
1
5
Используя Perl:
$ seq 10 | perl -ne 'print if 1..1 or eof'
1
10
, вышеприведенный отпечатает первый элемент в выходном отверстии seq 10
через , если 1...1
, в то время как или eof
также отпечатает последний элемент.
С помощью sed
вы можете d
elete строк, если NOT 1
st one AND NOT la$
t единица.
Используй !
- НЕ
(отрицать) условие и X{Y... }
для объединения X
И Y
условий:
cmd | sed '1!{$!d;}'
или вы можете использовать диапазон - от 2
и до la$
t - и удалить все строки в этом диапазоне, кроме la$
t строки:
cmd | sed '2,${$!d;}'