行数がわからない詩がありますが、最後から2番目の行だけを表示したいと思います。どのコマンドを使用する必要がありますか?
答え1
これを行う方法はいくつかありますが、これが私が見つけた最速の方法であり、私の考えには最もきれいな方法です。
シガーというファイルに書き込まれたと仮定すると、次のものをpoem
使用できます。
tail -n 2 poem | head -n 1
tail -n 2 poem
ファイルの最後の2行が記録されますpoem
。
head -n 1
前のコマンドで提供された出力の最初の行が記録されますtail
。
答え2
Edを使ってください!
ed -s poems <<< $'$-1\n'
poems
これは、edにスクリプトモード()でファイルを開くように指示し、-s
(追加のメッセージを印刷しないように)ここで文字列に「ファイルの最後の行に移動($
)、マイナス1」というアドレス指定コマンドを送信します。ライン。
入力時にファイルが与えられると~の:
A is for awk, which runs like a snail, and
B is for biff, which reads all your mail.
C is for cc, as hackers recall, while
D is for dd, the command that does all.
E is for emacs, which rebinds your keys, and
F is for fsck, which rebuilds your trees.
G is for grep, a clever detective, while
H is for halt, which may seem defective.
I is for indent, which rarely amuses, and
J is for join, which nobody uses.
K is for kill, which makes you the boss, while
L is for lex, which is missing from DOS.
M is for more, from which Less was begot, and
N is for nice, which it really is not.
O is for od, which prints out things nice, while
P is for passwd, which reads in strings twice.
Q is for quota, a Berkeley-type fable, and
R is for ranlib, for sorting ar sic table.
S is for spell, which attempts to belittle, while
T is for true, which does very little.
U is for uniq, which is used after Sort, and
V is for vi, which is hard to abort.
W is for whoami, which tells you your name, while
X is, well, X, of dubious fame.
Y is for yes, which makes an impression, and
Z is for zcat, which handles compression.
...結果出力は次のとおりです。
Y is for yes, which makes an impression, and
答え3
できます。
sed '2q;d' <(tac infile)
tac
infile
cat
私たちは、ファイルを入力として渡したかのように、逆の順序で印刷しますsed
。これにより、2行目(ここでは最初の行のみ)を除くすべての行が削除され、すぐに終了します。
または:
tail -n2 infile | sed '2d'
それともsed
sed 'x;$!d' <infile
sed
一度に1行ずつ読み取り、予約済みスペースを使用してx
現在の行処理を保存して!d
1回印刷します(削除しません)。sedすべての行(または最後の行)を読みます。sed予約済みスペースは1つしかないため、最後の行の場合、予約済みスペースには最後の2行目が含まれます。
sed -n 'x;$p' <infile
答え4
アッ
これはGNU awk(Linux)とBSD awk(Mac)で動作します。
空行を無視することもできます。この場合、awk 'NF' file.txt
このページで説明されている他の方法のいずれかを使用して出力をパイプできます。
awkを使用すると、これらすべてを一度に実行できます。
awk 'NF { a=b ; b=$0 } END { print a }' file.txt
NF
データを含む行のみが処理されます。NF
行のフィールド数を表し、ゼロより大きい値は「true」と見なされます。{ a=b ; b=$0 }
現在空でない行をとして保存b
し、空でない前の行をとして保存しますa
。
END { print a }
ファイル全体を確認した後a
(最後の空白ではなく2行目)の最終値を印刷します。
空白行を省略したくない場合は、以下を削除してくださいNF
。
awk '{ a=b ; b=$0 } END { print a }' file.txt