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

时间:2013-10-11 21:29:11

标签: linux shell unix sh

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

到目前为止,在线我只看过像sed这样的东西(我只能使用sh -not bash或sed或类似的东西)。我只需要使用基本的shell脚本来完成这个任务。

cat file | while read line
    do
       #do something
    done

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

12 个答案:

答案 0 :(得分:155)

sed的:

sed '5!d' file

AWK:

awk 'NR==5' file

答案 1 :(得分:15)

假设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

答案 2 :(得分:13)

您可以使用sed -n 5p file

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

答案 3 :(得分:6)

我通常将此用于此目的:

sed '5q;d' file

答案 4 :(得分:3)

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

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

p
上面命令中的

{{1}}表示打印。

以下是您所看到的内容: enter image description here

答案 5 :(得分:2)

执行此类操作的标准方法是使用外部工具。在编写shell脚本时不允许使用外部工具是荒谬的。但是,如果您确实不想使用外部工具,则可以使用以下命令打印第5行:

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

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

答案 6 :(得分:0)

William Pursell's answer并行,这是一个简单的构造,它甚至可以在原始的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

答案 7 :(得分:0)

perl很容易!如果你想从文件中获取第1,3和5行,请说/ etc / passwd:

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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

我对任何答案都不满意。

这是我的方法。

# 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]}"

答案 10 :(得分:0)

#!/bin/bash
for i in {1..50}
do
 line=$(sed "${i}q;d" file.txt)
 echo $line
done

答案 11 :(得分:0)

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

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

当不再需要数组 a 时,您可以丢弃它。