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


59

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


1
“仅显示某些编号的行”是什么意思,可以输入预期的输出吗?
tachomi

1
可能会有一百万种方法可以做到这一点。tail+ head也能做到这一点,因为可以awk
Bratchley

Answers:


120

采用 sed

用法

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

打印一行(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

27

一种方法是使用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

9

您可以直接使用awk。

awk 'NR==1' file.txt

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


1
这是一百万英里的最佳答案,应该比它拥有更多的爱。
Wren

8

根据我喜欢的目标还是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,虽然
roaima

1
是的,但是.....但是.....还有更好的方法。这个问题问了关于使用猫的问题,所以我使用了它。
coteyr

cat不能做OP想要的事情
roaima

2

正如其他人向您展示的那样,无需使用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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.