Differences between revisions 1 and 18 (spanning 17 versions)
Revision 1 as of 2007-05-02 22:55:48
Size: 620
Editor: redondos
Comment:
Revision 18 as of 2011-02-13 08:03:32
Size: 1331
Editor: Lhunath
Comment:
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
[[Anchor(faq11)]] <<Anchor(faq11)>>
Line 3: Line 3:
The dirty (but not quick) way would be {{{sed -n ${n}p "$file"}}} but this reads the whole input file, even if you only wanted the third line. The dirty (but not quick) way would be:
Line 5: Line 5:
The following {{{sed}}} command line reads a file printing nothing (-n). At line $n the command "p" is run, printing it, with a "q" afterwards: quit the program. {{{
    sed -n ${n}p "$file"
}}}
Line 7: Line 9:
but this reads the whole input file, even if you only wanted the third line.

This one avoids that problem:
Line 11: Line 16:
Another way, more obvious to some, is to grab the last line from a listing of the first n lines: At line $n the command "p" is run, printing it, with a "q" afterwards: quit the program.

Another way, more obvious to some, is to grab the last line from a listing of the first ''n'' lines:
Line 16: Line 23:
Using awk: Another approach, using [[AWK]]:
Line 18: Line 25:
   awk 'NR==n{print;exit}' file    awk "NR==$n{print;exit}" file
Line 20: Line 27:

If you want more than one line, it's pretty easy to adapt any of the previous methods:

{{{
   x=3 y=4
   sed -n "$x,${y}p;${y}q;" "$file" # Print lines $x to $y; quit after $y.
   head -n $y "$file" | tail -n $((y - x + 1)) # Same
   head -n $y "$file" | tail -n +$x # If your tail supports it
   awk "NR>=$x{print} NR==$y{exit}" "$file" # Same
}}}

=== Note ===
In most cases, you should sanitize your variable n to be sure, that it's not containing any of non-digits, before feeding it to sed or awk. You can do it with such simple code:
{{{
   # Bash
   n=${n//[!0-9]/}

   # POSIX
   n=$(printf "%s" "$n"|tr -cd '0-9')
}}}
----
CategoryShell

How can I print the n'th line of a file?

The dirty (but not quick) way would be:

    sed -n ${n}p "$file"

but this reads the whole input file, even if you only wanted the third line.

This one avoids that problem:

    sed -n "$n{p;q;}" "$file"

At line $n the command "p" is run, printing it, with a "q" afterwards: quit the program.

Another way, more obvious to some, is to grab the last line from a listing of the first n lines:

   head -n $n $file | tail -n 1 

Another approach, using AWK:

   awk "NR==$n{print;exit}" file

If you want more than one line, it's pretty easy to adapt any of the previous methods:

   x=3 y=4
   sed -n "$x,${y}p;${y}q;" "$file"                # Print lines $x to $y; quit after $y.
   head -n $y "$file" | tail -n $((y - x + 1))     # Same
   head -n $y "$file" | tail -n +$x                # If your tail supports it
   awk "NR>=$x{print} NR==$y{exit}" "$file"        # Same

Note

In most cases, you should sanitize your variable n to be sure, that it's not containing any of non-digits, before feeding it to sed or awk. You can do it with such simple code:

   # Bash
   n=${n//[!0-9]/}

   # POSIX
   n=$(printf "%s" "$n"|tr -cd '0-9')


CategoryShell

BashFAQ/011 (last edited 2020-05-07 08:35:17 by intranet)