web-dev-qa-db-ja.com

Linuxの「cat」コマンドで、特定の行のみを番号で表示するにはどうすればよいですか

cat -n text.txtを使用して行に自動的に番号を付ける場合、コマンドを使用して特定の番号付き行のみを表示する方法を教えてください。

77
Geckono1

sedを使用

使用法

$ cat file
Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7
Line 8
Line 9
Line 10

1行を印刷するには(5)

$ sed -n 5p file
Line 5

複数行を印刷するには(5&8)

$ sed -n -e 5p -e 8p file
Line 5
Line 8

特定の範囲を印刷するには(5-8)

$ sed -n 5,8p file
Line 5
Line 6
Line 7
Line 8

他の特定の行で範囲を印刷するには(5-8&10)

$ sed -n -e 5,8p -e 10p file
Line 5
Line 6
Line 7
Line 8
Line 10
151
tachomi

これを行う1つの方法は、sedを使用することです。

cat -n text.txt | sed '11d'

11は、削除する行の番号です。

または、11以外をすべて削除するには:

cat -n text.txt | sed '11!d'

範囲も可能です:

cat -n text.txt | sed '9,12!d'

そしてcat -nも必要ありません。

sed '9,12!d' text.txt
27
phk

Awkはまっすぐに使用できます。

awk 'NR==1' file.txt

「1」を目的の行番号に置き換えます。

12
KUBball3

目標に応じて、headやgrepが好きです

cat /var/log/syslog -n | head -n 50 | tail -n 10

41行目から50行目を返します。

または

cat /var/log/syslog -n | grep " 50" -b10 -a10

40〜60行目が表示されます。grepメソッドの問題は、行番号のパディング(スペースに注意)にアカウントを使用する必要があることです。

どちらもログファイルの解析に非常に便利です。

9
coteyr

他の人が示したように、cat -nを使用する必要はありません。他のプログラムが代わりにやってくれます。ただし、本当にcat -nの出力を解析して特定の行(たとえば、4-8、12、42)のみを表示する必要がある場合は、次のようにします。

$ cat -n file | awk '$1>=4 && $1<=8 || $1==12 || $1==42'
 4  Line 4
 5  Line 5
 6  Line 6
 7  Line 7
 8  Line 8
12  Line 12
42  Line 42

awkでは、$1が最初のフィールドであるため、このコマンドは最初のフィールドがi)4〜8(両端を含む)またはii)12またはiii)42であるすべての行を出力します。

ファイルから元の行を取得するためにcat -nによって追加されたフィールドも削除する場合は、次のようにします。

$ cat -n file | awk '$1>=4 && $1<=8 || $1==12 || $1==42{sub(/^\s*[0-9]+\s*/,""); print}'
Line 4
Line 5
Line 6
Line 7
Line 8
Line 12
Line 42
2
terdon