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

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

到目前为止,网上我只看到像sed的东西,(我只能使用sh -not bash或sed或类似的东西)。 我只需要使用基本的shell脚本来做到这一点。

cat file | while read line do #do something done 

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

SED:

 sed '5!d' file 

AWK:

 awk 'NR==5' file 

假设line是一个variables,它可以保存你所需要的行号,如果你可以使用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 

你可以使用sed -n 5p file

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

我通常用这个来达到这个目的:

sed '5q;d' file

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

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

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

例如,如果要获取文件的第10到第20行,可以使用以下两种方法中的每一种:

 head -n 20 york.txt | tail -11 

要么

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

上面的命令代表打印。

以下是您将看到的内容: 在这里输入图像说明

与威廉Pursell的答案并行,这是一个简单的构造,即使在原来的V Bourne shell(也是Bash不可用的地方)应该可以工作。

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

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

容易与Perl! 如果你想从文件中获得第1,3,5行,请说/ etc / passwd:

 perl -e 'while(<>){if(++$l~~[1,3,5]){print}}' < /etc/passwd 
 line=5; prep=`grep -ne ^ file.txt | grep -e ^$line:`; echo "${prep#$line:}"