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 ...
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}
sed -n '1p;$p' file.txt
affichera la 1ère et la dernière ligne de fichier.txt.
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='()'
Avec sed
vous pourriez d
suivre les lignes si PAS le 1
st 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 2
nd à la$
t - et supprimez toutes les lignes de cette plage à l'exception de la$
t ligne:
cmd | sed '2,${$!d;}'
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.
Sans chat:
$ cat file |tee >(head -n1) >(tail -n1) >/dev/null
1
5
ou
$ (head -n1 file;tail -n1 file)
1
5
$ seq 100 | { IFS= read -r first; echo "$first"; tail -1; }
1
100