是否有更简洁的方法来获取每一行的最后N个字符?

时间:2014-06-26 09:32:41

标签: bash command-line awk sed cut

为简化讨论,请N = 3

我目前提取文件或流中每行的最后三个字符的方法是使用sed来捕获组中的最后三个字符,并用该组替换整行。

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

它有效但看起来过于冗长,特别是当我们将第一个三个字符放在一行中的方法进行比较时。

cut -c -3

是否有更简洁的方法来提取每行中的最后N个字符?

4 个答案:

答案 0 :(得分:20)

使用grep -o '...$'非常简单:

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

或者更好的是:

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

通过这种方式,您可以根据自己喜欢的价值调整N

答案 1 :(得分:9)

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

答案 2 :(得分:6)

为什么当它是一个微小的命令时,强调简洁?一般性更为重要:

$ cat file
123456789
abcdefghijklmn

从第4个字符开始打印3个字符:

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

从第4个字符开始打印3个字符:

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

从每行中间的[around]打印3个字符:

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

答案 3 :(得分:0)

Pure bash解决方案:

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

SED

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