繁体   English   中英

仅使用Shell脚本从文本文件获取特定行

[英]Get specific line from text file using just shell script

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

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

cat file | while read line
    do
       #do something
    done

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

sed:

sed '5!d' file

awk:

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

您可以使用sed -n 5p file

您还可以获取范围,例如sed -n 5,10p file

最佳表现方法

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'绝对是性能上的提高!

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

head -n 20 york.txt | tail -11

要么

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

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

这是您将看到的内容: 在此处输入图片说明

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

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

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

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循环。

使用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:}"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM