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

mer*_*011 7 bash awk command-line cut sed

为了简化讨论,让我们N = 3.

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

sed 's/^.*\(.\{3\}\)/\1/'
Run Code Online (Sandbox Code Playgroud)

它有效,但它看起来过于冗长,特别是当我们比较一行中获得三个字符的方法时.

cut -c -3
Run Code Online (Sandbox Code Playgroud)

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

Tia*_*opo 21

这很简单grep -o '...$':

cat /etc/passwd  | grep -o '...$'
ash
/sh
/sh
/sh
ync
/sh
/sh
/sh
Run Code Online (Sandbox Code Playgroud)

或者更好的是:

N=3; grep -o ".\{$N\}$" </etc/passwd
ash
/sh
/sh
/sh
ync
/sh
/sh
Run Code Online (Sandbox Code Playgroud)

这样你就可以N根据自己喜欢的价值调整自己.

  • @ merlin2011这将丢弃少于3个字符的行.如果这是你想要的行为,那很好,否则,你可能想要考虑`.{1,3} $`. (4认同)
  • 这个答案在一般情况下也适用于`egrep -o'.{3} $'`.当计时器启动时我会接受它.:) (2认同)

Cyr*_*rus 9

rev /path/file | cut -c -3 | rev
Run Code Online (Sandbox Code Playgroud)

  • 我也喜欢这个答案,因为我几乎忘记了转速.+1!我也会在后面进行基准测试,看看双反转是否比正则表达更快. (2认同)
  • 是不是有点假,用3 shell命令替换单个sed'verbose'将使用更多的资源? (2认同)

Ed *_*ton 6

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

$ cat file
123456789
abcdefghijklmn
Run Code Online (Sandbox Code Playgroud)

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

$ awk '{print substr($0,4,3)}' file
456
def
Run Code Online (Sandbox Code Playgroud)

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

$ awk '{print substr($0,length($0)-3,3)}' file
678
klm
Run Code Online (Sandbox Code Playgroud)

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

$ awk '{print substr($0,(length($0)-3)/2,3)}' file
345
efg
Run Code Online (Sandbox Code Playgroud)