18

我在减少 egrep 的输出时遇到了一些问题。我的输出如下:

From: First Last
From: First Last
From: First Last

我想删掉“发件人:”(基本上是留下“First Last”)。

我试过

cut -d ":" -f 7

但输出只是一堆空行。

我将不胜感激任何帮助。

如果有帮助,这是我尝试使用的完整代码:

egrep '^From:' $file | cut -d ":" -f 7

注意:我已经测试了代码的 egrep 部分,它按预期工作。

4

7 回答 7

22

您问题中的cut命令行指定了以冒号分隔的字段,并且您希望输出仅包含字段 7;由于您的输入中没有第 7 个字段,因此您得到的结果不是您想要的。

由于“From:”前缀在所有行中似乎都是相同的,因此您可以简单地从第 7 个字符开始剪切:

egrep '^From:' $file | cut -c7-

并得到你想要的结果。

于 2013-10-17T21:04:47.860 回答
5

争论是针对-f什么领域。由于该行中只有一个:,因此只有两个字段。所以改成-f 7会给-f 2-你想要的。尽管具有领先的空间。

于 2013-10-17T21:04:28.327 回答
5

您可以将egrepcut部分组合成一个命令sed

sed -n 's/^From: //gp' $file

sed -n默认情况下关闭打印,然后我psed命令中明确使用来打印我想要的行。

于 2013-10-17T21:08:43.520 回答
4

你真的很亲近。

我认为您只需将“:”替换为“”作为分隔符并在“7”之后添加“-”:就像这样:

cut -d " " -f 2-

我测试并且工作得很好。

于 2017-05-08T13:24:48.107 回答
3

您可以使用 sed:

sed 's/^From: *//'

或 awk:

awk -F ': *' '$1=="From"{print $2}'

或者grep -oP

grep -oP '^From: *\K.*'
于 2013-10-17T21:06:59.813 回答
0

这是一个 Bash 单行代码:

grep ^From file.txt | while read -a cols; do echo ${cols[@]:1}; done

请参阅:在 wiki.bash-hackers.org处理位置参数

于 2016-04-10T02:57:36.190 回答
0

cut本身是 bash 中一个非常方便的工具

cut -d(分隔符)-f(您想要作为输出的字段)

单个字段直接给出为 -f 3 ,字段范围可以选择为 -f 5-9

所以在你的这种特殊情况下,代码将是

egrep '^From:' $file | 剪切-d\ -f 2-3

分隔符在这里是空格,可以使用\进行转义

-f 1 对应于“From”,2-3 对应于“First Last”

于 2018-01-11T05:35:16.070 回答