Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 第二对括号后的值的Grep_Bash_Search_Grep_Cut - Fatal编程技术网

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]*
。如果使用GNU
sed
,则可以使用
\+
(转义的
+

您也可以只在结尾锚定匹配(如@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]*
。如果使用GNU
sed
,则可以使用
\+
(转义的
+

您也可以只在结尾锚定匹配(如@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+”