使用 shell 脚本从文本文件中获取特定行

我试图从一个文本文件得到一个特定的行。

到目前为止,我只在网上看到过 sed 之类的东西(我只能使用 sh-not bash 或 sed 之类的东西)。我只需要使用一个基本的 shell 脚本就可以做到这一点。

cat file | while read line
do
#do something
done

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

320738 次浏览

教育局局长:

sed '5!d' file

谢谢:

awk 'NR==5' file

假设 line是一个保存所需行号的变量,如果可以使用 headtail,那么它就非常简单:

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

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

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

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

最佳性能 方法

sed '5q;d' file

因为 sed停止读取第5行之后的所有行

Roger Dueck 先生更新实验

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

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的优化是在循环外进行的。

你可以用 sed -n 5p file

你也可以得到一个范围,例如,sed -n 5,10p file

使用 perl 很简单! 如果想从文件中获取第1、3和5行,可以使用/etc/passwd:

perl -e 'while(<>){if(++$l~~[1,3,5]){print}}' < /etc/passwd

例如,如果你想得到一个文件的第10行到第20行,你可以分别使用以下两种方法:

head -n 20 york.txt | tail -11

或者

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

上面命令中的 p代表打印。

你会看到: enter image description here

line=5; prep=`grep -ne ^ file.txt | grep -e ^$line:`; echo "${prep#$line:}"

我不是特别喜欢这些答案。

我是这么做的。

# 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]}"
#!/bin/bash
for i in {1..50}
do
line=$(sed "${i}q;d" file.txt)
echo $line
done

假设这个问题是为 bash 提出的,这里有一种最快最简单的方法。

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

你可以在不需要的时候丢弃数组 a。

您可以使用 sed命令。

如果首选行号是5:

sed -n '5p' filename #get the 5th line and prints the value (p stands for print)

如果首选行号是一个范围,例如1-5行:

sed -n '1,5p' filename #get the 1 to 5th line and prints the values

如果只需要得到第一行和第五行,例如第一行,第五行:

sed -n '1p;5p;' filename #get the 1st and 5th line values only