cat -n text.txt
を使用して行に自動的に番号を付ける場合、コマンドを使用して特定の番号付き行のみを表示する方法を教えてください。
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
これを行う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
Awkはまっすぐに使用できます。
awk 'NR==1' file.txt
「1」を目的の行番号に置き換えます。
目標に応じて、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メソッドの問題は、行番号のパディング(スペースに注意)にアカウントを使用する必要があることです。
どちらもログファイルの解析に非常に便利です。
他の人が示したように、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