merlin2011
merlin2011

Reputation: 75585

Is there a cleaner way of getting the last N characters of every line?

To simplify the discussion, let N = 3.

My current approach to extracting the last three characters of every line in a file or stream is to use sed to capture the last three characters in a group and replace the entire line with that group.

sed 's/^.*\(.\{3\}\)/\1/'

It works but it seems excessively verbose, especially when we compare to a method for getting the first three characters in a line.

cut -c -3

Is there a cleaner way to extract the last N characters in every line?

Upvotes: 30

Views: 61806

Answers (4)

lx42.de
lx42.de

Reputation: 428

Pure bash solution:

$ while read -r in; do echo "${in: -3}"; done
hello
llo
$

sed

$ sed 's,.*\(.\{3\}\)$,\1,'
hallo
llo
$

Upvotes: 3

Ed Morton
Ed Morton

Reputation: 204164

Why emphasize brevity when it's a tiny command either way? Generality is much more important:

$ cat file
123456789
abcdefghijklmn

To print 3 characters starting from the 4th character:

$ awk '{print substr($0,4,3)}' file
456
def

To print 3 characters starting from the 4th-last character:

$ awk '{print substr($0,length($0)-3,3)}' file
678
klm

To print 3 characters from [around] the middle of each line:

$ awk '{print substr($0,(length($0)-3)/2,3)}' file
345
efg

Upvotes: 22

Tiago Lopo
Tiago Lopo

Reputation: 7959

It's very simple with grep -o '...$':

cat /etc/passwd  | grep -o '...$'
ash
/sh
/sh
/sh
ync
/sh
/sh
/sh

Or better yer:

N=3; grep -o ".\{$N\}$" </etc/passwd
ash
/sh
/sh
/sh
ync
/sh
/sh

That way you can adjust your N for whatever value you like.

Upvotes: 54

Cyrus
Cyrus

Reputation: 88776

rev /path/file | cut -c -3 | rev

Upvotes: 21

Related Questions