删除一行中前N个字符的Unix命令是什么?

348
例如,我可能想要:
tail -f logfile | grep org.springframework | <command to remove first N characters>

我认为tr可能有能力做到这一点,但我不确定。

7个回答

499

使用 cut 命令。例如,要去掉每行的前4个字符(也就是从第5个字符开始):

tail -f logfile | grep org.springframework | cut -c 5-

1
你有任何想法为什么管道不起作用吗?当我运行基本的命令时,‘cut’没有将结果打印到stdout……如果我只是运行 ‘tail -f logfile | cut -c 5-',我可以看到结果……问题必须与grep有关。我使用的是Cygwin FYI。谢谢。 - les2
1
哦,我明白了...你为什么要使用tail?只需执行grep org.springframework logfile | cut -c 5-即可。 但我认为sed更好用 :-) - LB40
8
问题在于grep会将大块数据缓存起来,然后再将它们发送到cut,因为它可以看出不是在写入终端。使用grep --line-buffered "org.springframework"来解决此问题。 - Steen Schütt
5 后面的 - 字符是什么意思?为什么? - Alexander Mills
如果我们只想对一行执行操作而不是每一行怎么办? - Sandy
显示剩余4条评论

64
sed 's/^.\{5\}//' logfile 

你可以用想要替换的数字代替5,这应该能解决问题...

编辑 如果对于每一行 sed 's/^.\{5\}//g' logfile


52

你可以使用 cut

cut -c N- file.txt > new_file.txt

-c: 字符数

file.txt: 输入文件

new_file.txt: 输出文件

N-: 从第N个字符到结尾的字符将会被剪切并输出至新文件。

还可以使用其他参数,如:'N','N-M','-M',分别表示第N个字符、第N到第M个字符、前M个字符。

此操作将对输入文件的每一行执行。


9
x=hello

echo ${x:1}

返回 ello

根据需要将 1 替换为 N


7
tail -f logfile | grep org.springframework | cut -c 900-

将删除前900个字符

cut使用了900-来表示从第900个字符到行尾的内容

然而,当我将所有这些内容通过grep管道传输时,却没有任何返回结果。


4
"cut -c 1-900" 不会 "删除前900个字符" -- 它只会保留前900个字符。如果你想要删除前900个字符,使用 "cut -c 901-"。 - iammichael
也就是说,根据@iammichael的回答,每行的前900个字符 - Blair Conrad
2
"cut -c 900-" 将删除前899个字符,对吗? - Yiding Zhou

6

这是一个简单的函数,在bash中经过测试。该函数的第一个参数是字符串,第二个参数是要剥离的字符数。

function stringStripNCharsFromStart {
    echo ${1:$2:${#1}}
}

用法:

$ stringStripNCharsFromStart "12abcdefgh-" 2
# 2abcdefgh-

屏幕截图:

控制台结果截图


5
你可以简化为 echo ${1:$2}。意思不变,语言更通俗易懂。 - kdubs

4

我认为awk是最适合的工具,因为它既可以过滤,又可以对过滤后的行执行必要的字符串操作函数:

tail -f logfile | awk '/org.springframework/ {print substr($0, 6)}'

或者

tail -f logfile | awk '/org.springframework/ && sub(/^.{5}/,"",$0)'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接