回答:
sedソリューション:
sed -e 1b -e '$!d' file
stdin
if から読み取るときは、次のようになります(例:)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 -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}
(head -n1 file;tail -n1 file)
最後のシンボルとして非常に大きなコマンドとパイプを使用することはできないため、これが最良の答えです。だから、| sed '1p;$!d'
短い1。
head && tail
本当にあなたのために働きますか?seq 10 | (head -n1 && tail -n1)
印刷1
のみ。
-e 1b
に、最初の行でsedスクリプトの最後に分岐します。この時点で、暗黙の「印刷」が行われます。入力が1行のみの場合、sedは終了します。それ以外の場合、最後を除くすべての行について、削除します。最後の行では、暗黙の「印刷」が再び発生します。
sed
4.2.2 では最後の行のみを保持します。乾杯。
sed -n '1p;$p' file.txt
file.txtの最初と最後の行を印刷します。
sed -e 1b -e '$!d'
それを望まないなら、あなたは好むかもしれません。
面白い純粋なBash≥4の方法:
cb() { (($1-1>0)) && unset "ary[$1-1]"; }
mapfile -t -C cb -c 1 ary < file
その後、配列のary
最初のフィールド(つまり、index 0
)がの最初の行にfile
なり、最後のフィールドがの最後の行になりfile
ます。コールバックcb
(配列内のすべての行を丸lurみする場合はオプション)は、メモリが乱雑にならないようにすべての中間行を設定解除します。無料の副産物として、ファイル内の行数もあります(配列の最後のインデックス+ 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='()'
ではsed
、あなたは可能性d
のラインをelete場合、NOT1
ST 1 AND NOTラ$
トン1。AND条件を結合するための条件と構成を(否定)
する!
ために使用します。NOT
X{Y..}
X
Y
cmd | sed '1!{$!d;}'
または、2
ndからla $
tまでの範囲を使用して、$
lat行を除くその範囲内のすべての行を削除できます。
cmd | sed '2,${$!d;}'
Perlの使用:
$ seq 10 | perl -ne 'print if 1..1 or eof'
1
10
上記の出力の最初の項目を印刷seq 10
経由if 1..1
しながら、or eof
また、最後の項目を印刷します。
/etc
abrt
ありyum.repos.d
ますか?
猫なし:
$ cat file |tee >(head -n1) >(tail -n1) >/dev/null
1
5
または
$ (head -n1 file;tail -n1 file)
1
5
$ seq 100 | { IFS= read -r first; echo "$first"; tail -1; }
1
100
wc -l
は、ファイルの最終行の出力とは関係ありません。