是否有任何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
我知道这是不好的做法,当编写脚本可以重复使用,但与外壳的日常工作时,它会是有用的,我能够过滤我的标准输出以这样的方式。
我也意识到这将是半平凡命令写入(缓冲区STDOUT,返回一个特定的线),但我想知道是否有一些标准的 shell命令要做到这一点,将可没有我丢弃脚本到位。
使用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'
ls -l | head -2 | tail -1
从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
为了完整起见;-)
短代码
find / | awk NR==3
寿命越短
find / | awk 'NR==3 {print $0; exit}'
您可以使用AWK:
ls -l | awk 'NR==2'
更新
上面的代码不会得到我们想要的,因为差一错误:ls -l命令的第一行是总线。 对于这一点,下面的修改后的代码将工作:
ls -l | awk 'NR==3'
是的Perl容易提供给你?
$ perl -n -e 'if ($. == 7) { print; exit(0); }'
显然,代替你想要什么7号。
另一个海报建议
ls -l | head -2 | tail -1
但是如果你管头到尾,看起来一切都交给线N被处理两次。
管道尾巴变成头
ls -l | tail -n +2 | head -n1
会更有效?
是的,最有效的方式(如已被乔纳森·莱弗勒指出)是使用具有打印和退出sed的:
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'
嗯
SED并没有我的情况下工作。 我提议:
为 “奇数” 行1,3,5,7 ... LS | AWK '0 ==(NR + 1)%2'
为 “偶数” 行2,4,6,8 LS | AWK '0 ==(NR)%2'
欲了解更多完整性..
ls -l | (for ((x=0;x<2;x++)) ; do read ; done ; head -n1)
扔掉行,直到你到达第二个,然后后打印出的第一道防线。 因此,它打印3号线。
如果这仅仅是第二行..
ls -l | (read; head -n1)
许多“读的必要投入。
我在.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>