Get specific line from text file using just shell script

LinuxShellUnixSh

Linux Problem Overview


I am trying to get a specific line from a text file.

So far, online I have only seen stuff like sed, (I can only use the sh -not bash or sed or anything like that). I need to do this only using a basic shell script.

cat file | while read line
	do
	   #do something
	done

I know how to iterate through lines, as shown above, but what if I just need to get the contents of a particular line

Linux Solutions


Solution 1 - Linux

sed:

sed '5!d' file

awk:

awk 'NR==5' file

Solution 2 - Linux

Assuming line is a variable which holds your required line number, if you can use head and tail, then it is quite simple:

head -n $line file | tail -1

If not, this should work:

x=0
want=5
cat lines | while read line; do
  x=$(( x+1 ))
  if [ $x -eq "$want" ]; then
    echo $line
    break
  fi
done

Solution 3 - Linux

You could use sed -n 5p file.

You can also get a range, e.g., sed -n 5,10p file.

Solution 4 - Linux

Best performance method

sed '5q;d' file

Because sed stops reading any lines after the 5th one

Update experiment from Mr. Roger Dueck

> I installed wcanadian-insane (6.6MB) and compared sed -n 1p /usr/share/dict/words and sed '1q;d' /usr/share/dict/words using the time command; the first took 0.043s, the second only 0.002s, so using 'q' is definitely a performance improvement!

Solution 5 - Linux

If for example you want to get the lines 10 to 20 of a file you can use each of these two methods:

head -n 20 york.txt | tail -11

or

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

p in above command stands for printing.

Here's what you'll see: enter image description here

Solution 6 - Linux

The standard way to do this sort of thing is to use external tools. Disallowing the use of external tools while writing a shell script is absurd. However, if you really don't want to use external tools, you can print line 5 with:

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

Note that this will print logical line 5. That is, if input-file contains line continuations, they will be counted as a single line. You can change this behavior by adding -r to the read command. (Which is probably the desired behavior.)

Solution 7 - Linux

I didn't particularly like any of the answers.

Here is how I did it.

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

Solution 8 - Linux

In parallel with William Pursell's answer, here is a simple construct which should work even in the original v7 Bourne shell (and thus also places where Bash is not available).

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

Notice also the optimization to break out of the loop when we have obtained the line we were looking for.

Solution 9 - Linux

Assuming the question was asked for bash, here is the fastest simplest way to do this.

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

You may may discard array a when not needed anymore.

Solution 10 - Linux

Easy with perl! If you want to get line 1, 3 and 5 from a file, say /etc/passwd:

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

Solution 11 - Linux

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

Solution 12 - Linux

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionGangstaGrahamView Question on Stackoverflow
Solution 1 - LinuxKentView Answer on Stackoverflow
Solution 2 - LinuxmicromosesView Answer on Stackoverflow
Solution 3 - LinuxNomas PrimeView Answer on Stackoverflow
Solution 4 - LinuxfaithonourView Answer on Stackoverflow
Solution 5 - LinuxMona JalalView Answer on Stackoverflow
Solution 6 - LinuxWilliam PursellView Answer on Stackoverflow
Solution 7 - Linuxuser12322620View Answer on Stackoverflow
Solution 8 - LinuxtripleeeView Answer on Stackoverflow
Solution 9 - LinuxPhiView Answer on Stackoverflow
Solution 10 - LinuxdagelfView Answer on Stackoverflow
Solution 11 - LinuxOderView Answer on Stackoverflow
Solution 12 - LinuxJoKalliauerView Answer on Stackoverflow