it-swarm.com.de

Wie lese ich die erste und letzte Zeile aus der Cat-Ausgabe?

Ich habe eine Textdatei. Aufgabe - erste und letzte Zeile aus der Datei abrufen

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

$ cat file
1
2
3
4
5

Benötigen Sie dies ohne Katzenausgabe (nur 1 und 5).

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

Vielleicht gibt es eine kürzere und kürzere Lösung ...

66
dmgl

sed Lösung:

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

Wenn Sie aus stdin lesen, würde dies so aussehen (zum Beispiel 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

Kopf & Schwanz Lösung:

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

Wenn Daten von einem Befehl kommen (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 Lösung:

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

Und auch das Beispiel mit 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 druckt die erste und letzte Zeile der Datei file.txt.

23
schaiba

Ein lustiger reiner Bash≥4 Weg:

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

Danach haben Sie ein Array ary mit dem ersten Feld (d. H. Mit dem Index 0) ist die erste Zeile von file und das letzte Feld ist die letzte Zeile von file. Der Rückruf cb (optional, wenn Sie alle Zeilen im Array schlürfen möchten) setzt alle Zwischenzeilen zurück, um den Speicher nicht zu überladen. Als freies Nebenprodukt haben Sie auch die Anzahl der Zeilen in der Datei (als letzter Index des Arrays + 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
gniourf_gniourf

Mit sed könnten Sie delete Zeilen löschen, wenn NICHT das 1st one ND NICHT the la$t eins.
Verwenden ! to NOT (negiere) eine Bedingung und das X{Y..} Konstrukt zum Kombinieren von X UND Y Bedingungen:

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

oder Sie könnten einen Bereich verwenden - von 2nd to la$t - und lösche alle Zeilen in diesem Bereich mit Ausnahme von la$t Zeile:

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

Verwenden von Perl:

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

Das obige druckt das erste Element in der Ausgabe von seq 10 über die if 1..1, während or eof druckt auch das letzte Element.

6
perlygatekeeper

Ohne Katze:

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

oder

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