How to display certain lines from a text file in Linux?

Solution 1:

sed -n '10000000,10000020p' filename

You might be able to speed that up a little like this:

sed -n '10000000,10000020p; 10000021q' filename

In those commands, the option -n causes sed to "suppress automatic printing of pattern space". The p command "print[s] the current pattern space" and the q command "Immediately quit[s] the sed script without processing any more input..." The quotes are from the sed man page.

By the way, your command

tail -n 10000000 filename | head 10

starts at the ten millionth line from the end of the file, while your "middle" command would seem to start at the ten millionth from the beginning which would be equivalent to:

head -n 10000010 filename | tail 10

The problem is that for unsorted files with variable length lines any process is going to have to go through the file counting newlines. There's no way to shortcut that.

If, however, the file is sorted (a log file with timestamps, for example) or has fixed length lines, then you can seek into the file based on a byte position. In the log file example, you could do a binary search for a range of times as my Python script here* does. In the case of the fixed record length file, it's really easy. You just seek linelength * linecount characters into the file.

* I keep meaning to post yet another update to that script. Maybe I'll get around to it one of these days.

Solution 2:

I found out the following use of sed

sed -n '10000000,+20p'  filename

Hope it's useful to someone!


Solution 3:

This is my first time posting here! Anyway, this one is easy. Let's say you want to pull line 8872 from your file called file.txt. Here is how you do it:

cat -n file.txt | grep '^ *8872'

Now the question is to find 20 lines after this. To accomplish this you do

cat -n file.txt | grep -A 20 '^ *8872'

For lines around or before see the -B and -C flags in the grep manual.