0

我在搜索文件的特定部分并将其存储到 bash shell 中的变量中时遇到问题。

这是我的文件的一个示例:

From root@machine2.com  Mon Jan  7 16:56:50 2013
Return-Path: <root@machine2.com>
X-Original-To: smsto+9121403571@machine2.com
Delivered-To: smsto+9121403571@machine2.com
Received: by machine2.com (Postfix, from userid 0)
        id 43C191A1ECE; Mon,  7 Jan 2013 16:56:50 +0330 (IRST)
Date: Mon, 07 Jan 2013 16:56:50 +0330
To: smsto+9121403571@machine2.com
Subject: =?us-ascii?Q?Testing\=08?=
User-Agent: Heirloom mailx 12.5 7/5/10
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Message-Id: <20130107132650.43C191A1ECE@machine2.com>
From: root@machine2.com (root)

My note ..
blah blah ...

我需要做的是将其中一些字段存储到变量中(参数如 FROM、SUBJECT 和 EMAIL BODY)

对于 FROM 和 SUBJECT 字段,搜索和获取数据很容易。但是对于 EMAIL BODY,如您所见,没有任何标签可以搜索它......所以我在想获取电子邮件正文的一种可能方法是搜索 FROM 标签,然后使用它的行号从中获取 EMAIL BODY文件末尾的下一行。

不幸的是,我不太熟悉 linux 命令来做这样的事情。

请帮我。

4

2 回答 2

1

您可以使用sed从空白行打印到文件末尾:

$ sed -n '/^\s*$/,$p' file

My note ..
blah blah ...

# Command substitution to store into a variable  
$ body=$(sed -n '/^\s*$/,$p' file)

$ echo $body
My note .. blah blah ...

# Remember to quote variables to respect newlines
$ echo "$body"

My note ..
blah blah ...

如果您不想包含第一个空行,请使用:

$ sed -n '/^\s*$/,$ {/^.*[^ ]\+.*/,$p}' file

或者去掉正文中的所有空行:

$ sed -n '/^\s*$/,$ {/^.*[^ ]\+.*/p}' file
于 2013-01-07T14:18:41.000 回答
0

解决该问题的另一种方法是查找第一个空行(它出现在您所说的“发件人:”行之后)并在此之后打印所有内容。您可以使用awk并设置空记录分隔符来执行此操作。例如:

BODY=$(awk 'NR>1' RS= file)

但是,上述的优点/问题是空白行将被丢弃。如果这是不可取的,这是一个应该满足的方法:

BODY=$(awk 'i==1; /^$/ { i=1 }' file) 

然后:

echo "$BODY"

结果:

My note ..
blah blah ...
于 2013-01-07T14:17:11.247 回答