2010-08-21 69 views
1

我有一个txt文件,看起来像这样SED正则表达式的地址范围

----------------------------------- 
      RUNNING PROCESSES 
----------------------------------- 

ftpd 
kswapd 
init 
etc.. 

--------------------------------- 
      HOSTNAME 
-------------------------------- 

mypc.local.com

使用sed我只想得到这个文件的一个部分。所以只是运行过程部分,但是我似乎没有让我的正则表达式正确地做到这一点。

我能走到今天

sed -n '/^-./,/RUNNING PROCESSES/, /[[:space::]]/p' linux.txt | more 

但是它一直在抱怨

-e表达#1,烧焦26:未知条命令',”

任何人可以帮助?

+0

你有三种模式这不是一个SED地址。它抱怨第二个'',我无法确定你的'p'指令正在尝试做什么。 – msw 2010-08-21 13:45:46

+0

'p'应该打印匹配的图案,因为打印被'-n'禁用。 – 2010-08-21 13:47:59

+0

是否要将输出中包含的“标题”(--- RUNNING PROCESSES ---)或仅包含进程(ftps,kswpd,init等)? – 2010-08-21 13:54:30

回答

2

您是不是要找:

sed -n '/RUNNING PROCESSES/,/HOSTNAME/p' linux.txt | 
    sed -e '/^[- ]/d' -e '/^$/d' 
+0

我只想要“正在运行的流程”部分... – 2010-08-21 14:02:08

0

我可能会更喜欢使用awk为:

awk '/RUNNING PROCESSES/ {s=2} 
    /^---/    {s=s-1} 
         {if(s>0){print}}' linux.txt 

awk会给你:

  RUNNING PROCESSES 
----------------------------------- 

ftpd 
kswapd 
init 
etc.. 

然后,您可以通过管道将通过sed '/^$/d'过滤掉空白行。

0

这里是公认的答案的另一个变量,而不是额外调用另一个sed的过程

sed -n '/RUNNING PROCESSES/,/HOSTNAME/{s/RUNN.*\|HOSTNAME//;s/--*//;/^$/!p}' file