如何获取文件中的某一行?


在Stackoverflow上看到一个题目”Shell/Bash Command to get nth line of STDOUT“,觉得不错,尝试了其中介绍的方法,然后结合自己之前的一些学习,总结/摘录至下文:

用Linux的命令获取文件中的某一行{Shell/Bash Command to get nth line of STDOUT}

Is there any bash command that will let you get the nth line of STDOUT?
That is to say, something that would take this

$ ls -l
-rw-r--r--@ 1 root wheel my.txt
-rw-r--r--@ 1 root wheel files.txt
-rw-r--r--@ 1 root wheel here.txt

and do something like

$ ls -l | magic-command 2
-rw-r--r--@ 1 root wheel files.txt

I realize this would be bad practice when writing scripts meant to be reused, BUT when working with the shell day to day it’d be useful to me to be able to filter my STDOUT in such a way.
I also realize this would be semi-trivial command to write (buffer STDOUT, return a specific line), but I want to know if there’s some standard shell command to do this that would be available without me dropping a script into place.


Using sed, just for variety:

ls -l | sed -n 2p

Using this alternative, which looks more efficient since it stops reading the input when the required line is printed, may generate a SIGPIPE in the feeding process, which may in turn generate an unwanted error message:

ls -l | sed -n -e '2{p;q}'

I’ve seen that often enough that I usually use the first (which is easier to type, anyway), though ls is not a command that complains when it gets SIGPIPE.
For a range of lines:

ls -l | sed -n 2,4p

For several ranges of lines:

ls -l | sed -n -e 2,4p -e 20,30p
ls -l | sed -n -e '2,4p;20,30p'
ls -l | head -2 | tail -1

Alternative to the nice head / tail way:

ls -al | awk 'NR==2'

or

ls -al | sed -n '2p'

From sed1line:

# print line number 52
sed -n '52p' # method 1
sed '52!d' # method 2
sed '52q;d' # method 3, efficient on large files

From awk1line:

# print line number 52
awk 'NR==52'
awk 'NR==52 {print;exit}' # more efficient on large files

Try this sed version:

ls -l | sed '2 ! d'

It says “delete all the lines that aren’t the second one”.


For the sake of completeness 😉
shorter code

find / | awk NR==3

shorter life

find / | awk 'NR==3 {print $0; exit}'

Is Perl easily available to you?

$ perl -n -e 'if ($. == 7) { print; exit(0); }'

Obviously substitute whatever number you want for 7.
You can use awk:

ls -l | awk 'NR==2'

Update
The above code will not get what we want because of off-by-one error: the ls -l command’s first line is the total line. For that, the following revised code will work:

ls -l | awk 'NR==3'

Another poster suggested

ls -l | head -2 | tail -1

but if you pipe head into tail, it looks like everything up to line N is processed twice.
Piping tail into head

ls -l | tail -n +2 | head -n1

would be more efficient?

原文链接:

http://stackoverflow.com/questions/1429556/shell-bash-command-to-get-nth-line-of-stdout


 

快速打印出文件中间位置的行
1.sed和awk

假设你需要20至40行的内容:

sed -n '20,40p' file_name
#
awk 'FNR>=20 && FNR<=40' file_name
2.sed的几种方式(打印/显示指定行)
# print line number 52
sed -n '52p' # method 1
sed '52!d' # method 2
sed '52q;d' # method 3, efficient on large files

method 3 efficient on large files

fastest way to display specific lines

3.先head然后tail

在Python中可以现将文件readlines()到一个list中,然后使用list切割方法进行查看——对于小文件而言。

4.先切割,然后分别查看

先split,然后grep、sed、awk、head、tail

参考
,

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注