Shell / Bash命令获取STDOUT的第n行

时间:2009-09-15 20:53:10

标签: bash shell sed stdout

是否有任何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命令来执行此操作可用没有我把脚本放到位。

12 个答案:

答案 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>