Bash 第二对括号后的值的Grep
给定一个如下所示的文件:Bash 第二对括号后的值的Grep,bash,search,grep,cut,Bash,Search,Grep,Cut,给定一个如下所示的文件: 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: (
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:”中的数据,输出应该是
grep
选择行,剪切将行拆分为给定分隔符(-d
)上的列,并返回给定列(-f
)
grep
选择行,剪切将行拆分为给定分隔符(-d
)上的列,并返回给定列(-f
)。使用sed
:
sed -nE '/^590,85:/ s/.*gray\(([0-9]+)\)/\1/ p' file
对于以590,85:
开头的行,我们匹配括号内的数字,并用该数字替换整行,打印它(并用-n
抑制所有不匹配行的输出)。扩展regexp通过-E
启用
为了完整性,如果您更喜欢POSIX基本正则表达式(BRE):
请注意,现在我们必须转义分组参数(而不是转义文字参数),还要模拟至少一个出现运算符(+
),我们必须将其分解为[0-9]
,然后在一个数字上加上零个或多个出现运算符,[0-9]*
。如果使用GNUsed
,则可以使用\+
(转义的+
)
您也可以只在结尾锚定匹配(如@David在评论中所建议的),并跳过gray
前缀的匹配:
sed -n '/^590,85:/ s/.*(\([0-9][0-9]*\))$/\1/ p' log
使用sed
:
sed -nE '/^590,85:/ s/.*gray\(([0-9]+)\)/\1/ p' file
对于以590,85:
开头的行,我们匹配括号内的数字,并用该数字替换整行,打印它(并用-n
抑制所有不匹配行的输出)。扩展regexp通过-E
启用
为了完整性,如果您更喜欢POSIX基本正则表达式(BRE):
请注意,现在我们必须转义分组参数(而不是转义文字参数),还要模拟至少一个出现运算符(+
),我们必须将其分解为[0-9]
,然后在一个数字上加上零个或多个出现运算符,[0-9]*
。如果使用GNUsed
,则可以使用\+
(转义的+
)
您也可以只在结尾锚定匹配(如@David在评论中所建议的),并跳过gray
前缀的匹配:
sed -n '/^590,85:/ s/.*(\([0-9][0-9]*\))$/\1/ p' log
您可以
grep
感兴趣的行,然后再次使用grep
提取值:
grep '^7,0:' /tmp/filename| grep -Po '\(\K\d+(?=\)$)'
248
您可以
grep
感兴趣的行,然后再次使用grep
提取值:
grep '^7,0:' /tmp/filename| grep -Po '\(\K\d+(?=\)$)'
248
在sed中,它将是:
$ sed -n 's/^7,0:.*(\([^)]*\).*/\1/p' file
248
但要保持简单,只需使用awk:
$ awk -F'[()]' '/^7,0:/{print $4}' file
248
在sed中,它将是:
$ sed -n 's/^7,0:.*(\([^)]*\).*/\1/p' file
248
但要保持简单,只需使用awk:
$ awk -F'[()]' '/^7,0:/{print $4}' file
248
您可以在不使用预匹配的情况下使用BRE,例如
sed-n的/^590,85:.*(\([0-9][0-9]*\)$/\1/p'
您说得对,谢谢。不知何故,我通常不遵守规则。但我会更新我的答案以确保完整性。:)没什么大不了的,两种方法都管用。我只是试着坚持使用BRE,只要它不会做什么,或者不会看起来像意大利面条,因为便携性的原因sed
是正确的选择,尽管OP建议grep
和cut
(这也是正确的,它只产生了3个进程而不是1个进程)。IMHO awk是正确的选择,因为它比任何其他解决方案都更简洁明了,但您也可以在sed中更简洁地做到这一点,请参见。@EdMorton,我同意,awk
解决方案是最优雅的。您可以在不使用prematch的情况下使用BRE,例如sed-n的/^590,85:.*(\([0-9][0-9]*\)$/\1/p'
您说得对,谢谢。不知何故,我通常不遵守规则。但我会更新我的答案以确保完整性。:)没什么大不了的,两种方法都管用。我只是试着坚持使用BRE,只要它不会做什么,或者不会看起来像意大利面条,因为便携性的原因sed
是正确的选择,尽管OP建议grep
和cut
(这也是正确的,它只产生了3个进程而不是1个进程)。IMHO awk是正确的选择,因为它比任何其他解决方案都更简洁明了,但您也可以在sed中更简洁地做到这一点,请参见。@EdMorton,我同意,awk
解决方案是最优雅的。可以组合和简化<代码>grep-Po“^7,0:*”(\K\d+”可以组合和简化…grep-Po“^7,0:*”(\K\d+”