
Eu tenho um arquivo de texto. Tarefa - obter a primeira e a última linha do arquivo depois
$ cat file | grep -E "1|2|3|4" | commandtoprint
$ cat file
1
2
3
4
5
Precisa disso sem saída cat (apenas 1 e 5).
~$ cat file | tee >(head -n 1) >(wc -l)
1
2
3
4
5
5
1
Talvez exista uma solução estranha e mais curta ...
Responder1
sedSolução:
sed -e 1b -e '$!d' file
Ao ler stdin
if ficaria assim (por exemplo 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
cabeça e caudaSolução:
(head -n1 && tail -n1) <file
Quando os dados vêm de um comando ( 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
estranhoSolução:
awk 'NR==1; END{print}' file
E também o exemplo canalizado com 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}
Responder2
sed -n '1p;$p' file.txt
imprimirá a primeira e a última linha de file.txt .
Responder3
Um jeito engraçado e puro do Bash≥4:
cb() { (($1-1>0)) && unset "ary[$1-1]"; }
mapfile -t -C cb -c 1 ary < file
Depois disso, você terá um array ary
com o primeiro campo (ou seja, com index 0
) sendo a primeira linha de file
, e seu último campo sendo a última linha de file
. O retorno de chamada cb
(opcional se você quiser sorver todas as linhas da matriz) desativa todas as linhas intermediárias para não sobrecarregar a memória. Como subproduto gratuito, você também terá o número de linhas no arquivo (como o último índice do array+1).
Demonstração:
$ 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='()'
Responder4
Sem gato:
$ cat file |tee >(head -n1) >(tail -n1) >/dev/null
1
5
ou
$ (head -n1 file;tail -n1 file)
1
5