cat -n text.txt
自动为行编号,那么我该如何使用命令仅显示某些编号的行。#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'
pre >
范围也是可能的:
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或grepcat /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
评论
“仅显示某些编号的行”是什么意思,可以输入预期的输出吗?可能会有一百万种方法可以做到这一点。尾巴和头部也可以这样做,awk也可以这样做