在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