2017-07-25 64 views
1

的考虑,看起来像这样的文件后,值:grep命令第二对括号

0,0: (63736) #F8F8F8 gray(248) 
1,0: (63736) #F8F8F8 gray(248) 
2,0: (63736) #F8F8F8 gray(248) 
3,0: (63736) #F8F8F8 gray(248) 
4,0: (63736) #F8F8F8 gray(248) 
5,0: (63736) #F8F8F8 gray(248) 
6,0: (63736) #F8F8F8 gray(248) 
7,0: (63736) #F8F8F8 gray(248) 
8,0: (63736) #F8F8F8 gray(248) 

将所有的方式为“799599”。我需要灰色圆括号中以“590,85:”开头的行的数字。例如,如果我想要来自“7,0:”的数据,那么输出应该是这样的。

248 

回答

1
grep ^590,85: filename | cut -f3 -d'(' | cut -f1 -d')' 

grep选择行,切割分割行成在给定的定界符(-d)列和返回给定列(-f)。

1

随着sed

sed -nE '/^590,85:/ s/.*gray\(([0-9]+)\)/\1/ p' file 

对于与590,85:开头的行,我们匹配括号内的数字,并与数代替整条生产线,印刷它(和抑制输出为所有不匹配的行-n )。扩展的正则表达式使用-E启用。

为了完整起见,如果你喜欢POSIX基本正则表达式(BRE):

sed -n '/^590,85:/ s/.*gray(\([0-9][0-9]*\))/\1/ p' log 

注意,现在我们要逃避分组括号(我们不逃避字面括号),也以模仿(+),我们必须将其分解为[0-9],后面跟零个或多个出现运算符的数字,[0-9]*。如果使用GNU sed,则可以使用\+(转义+)。

你也可以只锚比赛结束时(如@大卫在评论中所建议的),并跳过gray前缀匹配:

sed -n '/^590,85:/ s/.*(\([0-9][0-9]*\))$/\1/ p' log 
+0

您可以使用BRE没有预匹配,例如'sed -n's/^ 590,85:。*(\([0-9] [0-9] * \))$/\ 1/p'' –

+0

你说得对,谢谢。我不知何故通常默认为ERE。但我会更新我的答案的完整性。 :) – randomir

+1

没什么大不了的,两种方式都有效。出于便携性的原因,只要没有它不会做的事情,或者没有看起来像意大利面一样,我就会努力坚持BRE。 'sed'是正确的选择,尽管OP建议'grep'和'cut'(这也是正确的,它只是产生3个进程而不是1个)。 –

0

您可以grep你有兴趣就行了,而再次使用grep提取值:

grep '^7,0:' /tmp/filename| grep -Po '\(\K\d+(?=\)$)' 
248 
+0

可以组合和简化...'grep -Po'^ 7,0:。* \(\ K \ d +'' – Sundeep

2

在sed这将会是:

$ sed -n 's/^7,0:.*(\([^)]*\).*/\1/p' file 
248 

但保持它的简单,只是用awk:

$ awk -F'[()]' '/^7,0:/{print $4}' file 
248