使用 Linux 的“cat”命令,如何仅按数字显示某些行

Gec*_*no1 126 text-processing cat

如果我使用cat -n text.txt自动编号行,那么我如何使用该命令仅显示某些编号的行。

tac*_*omi 236

sed

用法

$ cat file
Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7
Line 8
Line 9
Line 10
Run Code Online (Sandbox Code Playgroud)

打印一行 (5)

$ sed -n 5p file
Line 5
Run Code Online (Sandbox Code Playgroud)

打印多行 (5 & 8)

$ sed -n -e 5p -e 8p file
Line 5
Line 8
Run Code Online (Sandbox Code Playgroud)

打印特定范围 (5 - 8)

$ sed -n 5,8p file
Line 5
Line 6
Line 7
Line 8
Run Code Online (Sandbox Code Playgroud)

使用其他特定行打印范围 (5 - 8 & 10)

$ sed -n -e 5,8p -e 10p file
Line 5
Line 6
Line 7
Line 8
Line 10
Run Code Online (Sandbox Code Playgroud)


phk*_*phk 45

一种方法是使用sed

cat -n text.txt | sed '11d'
Run Code Online (Sandbox Code Playgroud)

其中 11 是要删除的行号。

或者删除除 11 之外的所有内容:

cat -n text.txt | sed '11!d'
Run Code Online (Sandbox Code Playgroud)

范围也是可能的:

cat -n text.txt | sed '9,12!d'
Run Code Online (Sandbox Code Playgroud)

而且cat -n甚至没有必要:

sed '9,12!d' text.txt
Run Code Online (Sandbox Code Playgroud)


小智 29

您可以直接使用 awk。

awk 'NR==1' file.txt
Run Code Online (Sandbox Code Playgroud)

用所需的行号替换“1”。


cot*_*eyr 13

根据目标,我喜欢 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 方法的问题是你必须使用 account 来填充行号(注意空格)

两者对于解析日志文件都非常方便。

  • 嗯,是的……但是……但是…………有更好的方法。该问题询问了使用 cat 的问题,所以我使用了它。 (2认同)

ter*_*don 5

正如其他人向您展示的那样,没有必要使用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
Run Code Online (Sandbox Code Playgroud)

In 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
Run Code Online (Sandbox Code Playgroud)