是否有任何bash命令可以让你获得STDOUT的第n行?
也就是说,这会带来这个
$ 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
并执行类似
的操作$ ls -l | magic-command 2
-rw-r--r--@ 1 root wheel files.txt
我意识到在编写要重用的脚本时这将是不好的做法,但是当我每天使用shell时,能够以这种方式过滤我的STDOUT对我来说是有用的。
我也意识到这将是半平凡的写命令(缓冲区STDOUT,返回一个特定的行),但我想知道是否有一些标准 shell命令来执行此操作可用没有我把脚本放到位。
答案 0 :(得分:295)
使用sed
,只是为了变化:
ls -l | sed -n 2p
使用此替代方案,由于在打印所需行时停止读取输入,因此效率更高,可能会在提供过程中生成一个SIGPIPE,这可能会产生不需要的错误消息:
ls -l | sed -n -e '2{p;q}'
我经常看到我经常使用第一个(无论如何都更容易打字),尽管ls
不是一个在获得SIGPIPE时抱怨的命令。
对于一系列行:
ls -l | sed -n 2,4p
对于多行范围:
ls -l | sed -n -e 2,4p -e 20,30p
ls -l | sed -n -e '2,4p;20,30p'
答案 1 :(得分:74)
ls -l | head -2 | tail -1
答案 2 :(得分:39)
替代漂亮的头/尾方式:
ls -al | awk 'NR==2'
或
ls -al | sed -n '2p'
答案 3 :(得分:21)
来自sed1line:
# print line number 52
sed -n '52p' # method 1
sed '52!d' # method 2
sed '52q;d' # method 3, efficient on large files
来自awk1line:
# print line number 52
awk 'NR==52'
awk 'NR==52 {print;exit}' # more efficient on large files
答案 4 :(得分:7)
为了完整起见; - )
更短的代码
find / | awk NR==3
寿命缩短
find / | awk 'NR==3 {print $0; exit}'
答案 5 :(得分:6)
试试这个sed
版本:
ls -l | sed '2 ! d'
它说“删除所有不属于第二行的行”。
答案 6 :(得分:6)
您可以使用awk:
ls -l | awk 'NR==2'
上述代码因为一个错误而无法获得我们想要的内容: ls -l </ strong>命令的第一行是 total 行。为此,以下修订后的代码将起作用:
ls -l | awk 'NR==3'
答案 7 :(得分:4)
Perl很容易为您提供吗?
$ perl -n -e 'if ($. == 7) { print; exit(0); }'
显然可以用7代替你想要的数字。
答案 8 :(得分:0)
是的,最有效的方法(正如Jonathan Leffler已经指出的那样)是使用sed with print&amp;退出:
set -o pipefail # cf. help set
time -p ls -l | sed -n -e '2{p;q;}' # only print the second line & quit (on Mac OS X)
echo "$?: ${PIPESTATUS[*]}" # cf. man bash | less -p 'PIPESTATUS'
答案 9 :(得分:0)
嗯
在我的案例中,sed不起作用。 我建议:表示“奇数”行1,3,5,7 ... ls | awk'0 ==(NR + 1)%2'
表示“偶数”行2,4,6,8 ls | awk'0 ==(NR)%2'
答案 10 :(得分:-1)
更完整..
ls -l | (for ((x=0;x<2;x++)) ; do read ; done ; head -n1)
扔掉线直到你到达第二行,然后打印出第一行。所以,它打印第3行。
如果只是第二行......
ls -l | (read; head -n1)
根据需要添加尽可能多的“读取”。
答案 11 :(得分:-1)
我在.bash_profile
中添加了这个function gdf(){
DELETE_FILE_PATH=$(git log --diff-filter=D --summary | grep delete | grep $1 | awk '{print $4}')
SHA=$(git log --all -- $DELETE_FILE_PATH | grep commit | head -n 1 | awk '{print $2}')
git show $SHA -- $DELETE_FILE_PATH
}
它的确有效
gdf <file name>