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

评论

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

可能会有一百万种方法可以做到这一点。尾巴和头部也可以这样做,awk也可以这样做

#1 楼

使用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


#2 楼


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


#3 楼

您可以直接使用awk。

awk 'NR==1' file.txt


将'1'替换为所需的行号。

评论


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

– ren
18年4月4日在15:56

#4 楼

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

两者都相当便于分析日志文件。

评论


虽然这两个例子都不需要猫

–roaima
16年6月9日在9:12

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

–牛羚
16年6月9日在9:22

猫不能做OP想要的

–roaima
16年6月9日在9:33

#5 楼

正如其他人向您展示的那样,无需使用cat -n。其他程序将为您做到这一点。但是,如果确实需要解析cat -n的输出并仅显示特定行(例如4-8、12和42),则可以执行以下操作:

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


awk中,是第一个字段,因此此命令将打印所有第一个字段为i)在4和8(含)之间或ii)12或iii)42之间的行。

如果您还想要删除cat -n添加的字段以从文件中获取原始行,可以执行以下操作:

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


评论


您能使用NR而不是$ 1吗?

–所罗门·乌科(Solomon Ucko)
20 May 27 '18:57

@SolomonUcko当然可以,但是由于我具体演示了如何使用cat -n进行此操作,因此我想我将使用cat -n提供的输出。

– terdon♦
20 May 27 '18:59

#6 楼

您可以使用sed仅显示一个数字,并使用for循环对其进行循环:
for line in 1 3 7 11; do sed -n ${line}p text.txt; done