web-dev-qa-db-fra.com

Comment lire la première et la dernière ligne de la sortie cat?

J'ai un fichier texte. Tâche - obtenir la première et la dernière ligne du fichier après

$ cat file | grep -E "1|2|3|4" | commandtoprint

$ cat file
1
2
3
4
5

Besoin de cela sans sortie de chat (seulement 1 et 5).

~$ cat file | tee >(head -n 1) >(wc -l)
1
2
3
4
5
5
1

Il existe peut-être une solution géniale et plus courte ...

66
dmgl

sed Solution:

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

Lors de la lecture de stdin if ressemblerait à ceci (par exemple 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

tête et queue Solution:

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

Lorsque les données proviennent d'une commande (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 Solution:

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

Et aussi l'exemple canalisé avec 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}
121
chaos

sed -n '1p;$p' file.txt affichera la 1ère et la dernière ligne de fichier.txt.

23
schaiba

Une drôle de façon pure Bash≥4:

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

Après cela, vous aurez un tableau ary avec le premier champ (c'est-à-dire avec l'index 0) étant la première ligne de file, et son dernier champ étant la dernière ligne de file. Le callback cb (facultatif si vous souhaitez slurper toutes les lignes du tableau) désactive toutes les lignes intermédiaires afin de ne pas encombrer la mémoire. En tant que sous-produit gratuit, vous aurez également le nombre de lignes dans le fichier (comme le dernier index du tableau + 1).

Démo:

$ 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
gniourf_gniourf

Avec sed vous pourriez dsuivre les lignes si PAS le 1st one AND NOT the la$Ton.
Utilisation ! à NOT (annuler) une condition et le X{Y..} construction pour combiner X ET Y conditions:

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

ou vous pouvez utiliser une plage - de 2nd à la$t - et supprimez toutes les lignes de cette plage à l'exception de la$t ligne:

cmd | sed '2,${$!d;}'
7
don_crissti

Utilisation de Perl:

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

Ce qui précède imprime le premier élément de la sortie de seq 10 via le if 1..1, tandis que le or eof imprimera également le dernier élément.

6
perlygatekeeper

Sans chat:

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

ou

$ (head -n1 file;tail -n1 file)
1
5
4
user55518
$ seq 100 | { IFS= read -r first; echo "$first"; tail -1; }
1
100
4
glenn jackman