128

我正在尝试从文本文件中获取特定行。

到目前为止,我在网上只看到过 sed 之类的东西(我只能使用 sh -not bash 或 sed 或类似的东西)。我只需要使用基本的 shell 脚本来执行此操作。

cat file | while read line
    do
       #do something
    done

我知道如何遍历行,如上所示,但是如果我只需要获取特定行的内容怎么办

4

12 回答 12

243

赛德:

sed '5!d' file

awk:

awk 'NR==5' file
于 2013-10-11T21:40:21.437 回答
31

假设line是一个包含您所需行号的变量,如果您可以使用headand tail,那么它非常简单:

head -n $line file | tail -1

如果没有,这应该工作:

x=0
want=5
cat lines | while read line; do
  x=$(( x+1 ))
  if [ $x -eq "$want" ]; then
    echo $line
    break
  fi
done
于 2013-10-11T21:52:51.720 回答
24

你可以使用sed -n 5p file.

您还可以获得一个范围,例如sed -n 5,10p file.

于 2016-03-04T13:36:23.563 回答
19

最佳性能方法

sed '5q;d' file

因为sed在第 5 行之后停止读取任何行

来自Roger Dueck 先生的更新实验

我安装了 wcanadian-insane (6.6MB) 并使用 time 命令比较了 sed -n 1p /usr/share/dict/words 和 sed '1q;d' /usr/share/dict/words;第一个用了 0.043s,第二个只用了 0.002s,所以使用 'q' 绝对是性能的提升!

于 2015-06-05T02:01:19.573 回答
9

If for example you want to get the lines 10 to 20 of a file you can use each of these two methods:

head -n 20 york.txt | tail -11

or

sed -n '10,20p' york.txt 

p in above command stands for printing.

Here's what you'll see: enter image description here

于 2016-05-23T18:08:26.547 回答
2

做这种事情的标准方法是使用外部工具。在编写 shell 脚本时不允许使用外部工具是荒谬的。但是,如果您真的不想使用外部工具,可以使用以下命令打印第 5 行:

i=0; while read line; do test $((++i)) = 5 && echo "$line"; done < input-file

请注意,这将打印逻辑第 5 行。也就是说,如果input-file包含行继续,它们将被计为单行。-r您可以通过添加到 read 命令来更改此行为。(这可能是期望的行为。)

于 2013-10-11T23:56:44.277 回答
2

我不是特别喜欢任何答案。

这是我的做法。

# Convert the file into an array of strings
lines=(`cat "foo.txt"`)

# Print out the lines via array index
echo "${lines[0]}"
echo "${lines[1]}"
echo "${lines[5]}"
于 2020-05-09T21:25:30.053 回答
1

假设这个问题是针对 bash 的,这是最快最简单的方法。

readarray -t a <file ; echo ${a[5-1]}

您可以在不再需要时丢弃数组 a 。

于 2021-05-07T05:59:04.110 回答
1

William Pursell 的回答平行,这里有一个简单的结构,即使在原始的 v7 Bourne shell 中也可以工作(因此也适用于 Bash 不可用的地方)。

i=0
while read line; do
    i=`expr "$i" + 1`
    case $i in 5) echo "$line"; break;; esac
done <file

break当我们获得我们正在寻找的行时,还要注意对循环外的优化。

于 2015-09-09T04:04:38.337 回答
0
#!/bin/bash
for i in {1..50}
do
 line=$(sed "${i}q;d" file.txt)
 echo $line
done
于 2021-04-04T11:28:28.653 回答
0
line=5; prep=`grep -ne ^ file.txt | grep -e ^$line:`; echo "${prep#$line:}"
于 2016-11-24T23:34:21.593 回答
0

用 perl 很容易!如果您想从文件中获取第 1、3 和 5 行,例如 /etc/passwd:

perl -e 'while(<>){if(++$l~~[1,3,5]){print}}' < /etc/passwd
于 2016-03-23T13:38:19.860 回答