我在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)
for FROM和SUBJECT字段,很容易搜索和获取数据。但是对于EMAIL BODY,正如你所看到的,没有任何标签来搜索它…所以我在想一个可能的方法来获得电子邮件正文将搜索FROM标签,然后使用它的行号来获得电子邮件正文从下一行到文件结束。
不幸的是,我不太熟悉linux命令来做这样的事情。
请帮帮我。
您可以使用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
解决这个问题的另一种方法是查找第一个空行(出现在您谈论的'From:'行之后)并打印其后的所有内容。您可以使用awk
并设置空记录分隔符来实现这一点。例如:
BODY=$(awk 'NR>1' RS= file)
然而,上面的优点/问题是空行将被丢弃。如果不希望这样,下面的方法应该满足:
BODY=$(awk 'i==1; /^$/ { i=1 }' file)
:
echo "$BODY"
结果:
My note ..
blah blah ...