web-dev-qa-db-ja.com

cat出力から最初と最後の行を読み取る方法は?

テキストファイルがあります。タスク-後のファイルから最初と最後の行を取得する

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

$ cat file
1
2
3
4
5

Cat出力なしでこれが必要です(1と5のみ)。

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

多分awkともっと短い解決策が存在します...

66
dmgl

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ソリューション:

(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}
121
chaos

sed -n '1p;$p' file.txtはfile.txtの最初と最後の行を出力します。

23
schaiba

面白い純粋なBash≥4の方法:

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

この後、配列aryが最初のフィールド(つまり、インデックス0)はfileの最初の行であり、その最後のフィールドはfileの最後の行です。コールバックcb(配列内のすべての行をスラップする場合はオプション)は、メモリを乱雑にしないようにすべての中間行の設定を解除します。無料の副産物として、ファイルの行数も(配列の最後のインデックスとして+1)あります。

デモ:

$ 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

sedを使用すると、[〜#〜] not [〜#〜]1st one AND NOTの場合、delete行できます= la$t 1つ。
!NOT(否定)を使用して、条件とX{Y..}構文を組み合わせてX[〜#〜] and [ 〜#〜]Y条件:

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

または、2ndからla$tまでの範囲を使用して、la$t行を除くその範囲内のすべての行を削除できます。

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

Perlの使用:

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

上記はseq 10を介してif 1..1の出力の最初の項目を印刷しますが、or eofも最後の項目を印刷します。

6
perlygatekeeper

猫なし:

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

または

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