壳牌/ bash命令来获得标准输出的第n行(Shell/Bash Command to get nt

2019-07-18 03:16发布

是否有任何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命令要做到这一点,将可没有我丢弃脚本到位。

Answer 1:

使用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'


Answer 2:

ls -l | head -2 | tail -1


Answer 3:

替代漂亮的头/尾方式:

ls -al | awk 'NR==2'

要么

ls -al | sed -n '2p'


Answer 4:

从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


Answer 5:

为了完整起见;-)

短代码

find / | awk NR==3

寿命越短

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


Answer 6:

试试这个sed版本:

ls -l | sed '2 ! d'

它说:“删除所有不属于第二个行”。



Answer 7:

您可以使用AWK:

ls -l | awk 'NR==2'

更新

上面的代码不会得到我们想要的,因为差一错误:ls -l命令的第一行是线。 对于这一点,下面的修改后的代码将工作:

ls -l | awk 'NR==3'


Answer 8:

是的Perl容易提供给你?

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

显然,代替你想要什么7号。



Answer 9:

另一个海报建议

ls -l | head -2 | tail -1

但是如果你管头到尾,看起来一切都交给线N被处理两次。

管道尾巴变成头

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

会更有效?



Answer 10:

是的,最有效的方式(如已被乔纳森·莱弗勒指出)是使用具有打印和退出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'


Answer 11:

SED并没有我的情况下工作。 我提议:

为 “奇数” 行1,3,5,7 ... LS | AWK '0 ==(NR + 1)%2'

为 “偶数” 行2,4,6,8 LS | AWK '0 ==(NR)%2'



Answer 12:

欲了解更多完整性..

ls -l | (for ((x=0;x<2;x++)) ; do read ; done ; head -n1)

扔掉行,直到你到达第二个,然后后打印出的第一道防线。 因此,它打印3号线。

如果这仅仅是第二行..

ls -l | (read; head -n1)

许多“读的必要投入。



Answer 13:

我在.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>


文章来源: Shell/Bash Command to get nth line of STDOUT