使用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,它可以保存你所需要的行号,如果你可以使用head
和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
你可以使用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:}"