Regex 带正则表达式的bash

Regex 带正则表达式的bash,regex,bash,grep,Regex,Bash,Grep,我有一个包含GC内容的文件,比如应用程序线程停止的总时间:0.0017830秒,停止线程的时间:0.0002897秒以及更多类似的行。为了进行故障排除,我需要提取停止的行:将超过1.x秒 我试过使用grep'stopped[:1-9]*',但我对正则表达式的使用不是很在行。你能帮帮我吗 谢谢。试试看 grep -E 'stopped: ([1-9]\.|[0-9]{2}\.)' file 捕获10个。还有 或者,最好去掉公共元素并允许多于2的数字 grep -E 'stopped: ([1

我有一个包含GC内容的文件,比如
应用程序线程停止的总时间:0.0017830秒,停止线程的时间:0.0002897秒
以及更多类似的行。为了进行故障排除,我需要提取
停止的行:
将超过
1.x

我试过使用
grep'stopped[:1-9]*'
,但我对正则表达式的使用不是很在行。你能帮帮我吗

谢谢。

试试看

 grep -E 'stopped: ([1-9]\.|[0-9]{2}\.)' file
捕获10个。还有

或者,最好去掉公共元素并允许多于2的数字

 grep -E 'stopped: ([1-9]|[0-9]{2,})\.' file
试一试

捕获10个。还有

或者,最好去掉公共元素并允许多于2的数字

 grep -E 'stopped: ([1-9]|[0-9]{2,})\.' file
我会推荐使用这个工作,让你有更多的正则表达式选项

以下是适合您的用例的正则表达式的起点:

egrep "stopped: [0-9]+" data.txt
这将返回任何已停止的行:,后跟至少一个数字。

我建议使用此作业,这将为您提供更多正则表达式选项

以下是适合您的用例的正则表达式的起点:

egrep "stopped: [0-9]+" data.txt

这将返回任何已停止的行:,后面至少有一个数字。

简单地排除那些时间较短的行不是更容易吗

grep 'stopped: ' | grep -v 'stopped: 0'

简单地排除那些时间较短的人不是更容易吗

grep 'stopped: ' | grep -v 'stopped: 0'

您可以使用
FPAT
变量使用gnu awk:

awk -v FPAT="stopped: *[0-9.]+" '{val=$1; sub(/.*: */, "", val)} val > 1' file
使用
FPAT
我们只匹配
stopped:[0-9.]+
regex作为字段。这给了我们类似于
停止:1.1017830
$1
。使用
sub
函数,我们删除了
之前的所有内容:
和后面的空格,从而在变量
val
中只留下数字,即
1.1017830


最后,
val>1
将打印此数字
val
大于
1
的行。您可以使用
FPAT
变量使用gnu awk:

awk -v FPAT="stopped: *[0-9.]+" '{val=$1; sub(/.*: */, "", val)} val > 1' file
grep -E 'Stopping.*[1-9][0-9]*\.[0-9]+' file
使用
FPAT
我们只匹配
stopped:[0-9.]+
regex作为字段。这给了我们类似于
停止:1.1017830
$1
。使用
sub
函数,我们删除了
之前的所有内容:
和后面的空格,从而在变量
val
中只留下数字,即
1.1017830

最后,
val>1
将打印此数字
val
大于
1
的行

grep -E 'Stopping.*[1-9][0-9]*\.[0-9]+' file
[1-9][0-9]*\.[0-9]+
确保“超过1.x秒”



[1-9][0-9]*\.[0-9]+
是为了确保“超过1.x秒”

@Raja:但它将如何过滤大于
1.x秒的值的结果
@anubhava我根据需要修改了它,
echo“应用程序线程已停止:7.0011040秒”| egrep“已停止:[1-9]+”
和输出
应用程序线程被停止:7.0011040秒
@Raja:但它将如何过滤大于
1.x秒的值的结果
@anubhava我根据需要修改了它,
echo“应用程序线程被停止:7.0011040秒”| egrep“停止:[1-9]+”
和输出
应用程序线程停止:7.0011040秒
你能解释一下吗,有点难理解。我在回答中添加了一些解释。非常好的Anubhava:)你能解释一下吗,有点难理解。我在回答中添加了一些解释。非常好的Anubhava:)啊!我怎么错过了-v选项。啊!我错过了-V选项。你只是改变了我的想法,让它成为完美的解决方案:([1-9])[[09] { 2 }),这里[1-9]是第一个匹配,而对于十进制,你添加了点(.),并用反SLASH()逃出,所以它应该被认为是正常字符,{ 2 }用于下两个小数。所以从00到99。但为什么是最后一个点,为什么你逃避了它?我只是不能把这部分和我的问题联系起来。你能解释一下吗。谢谢。是的,它将匹配<代码> 00。< /代码>,但是我不认为这是一个有效的格式来考虑(不必要的前导零)。它只表示小数点前的1-9或小数点前的两位数。假设前导数字是一个没有前导零的有效数字。注意,这也不会捕获3个或更多的数字。我编辑以包含它们。@ccf我理解,我只是试图解释regext检查是否等于大于1的regex。翻译为:如果是个位数,则应为1或更多;或者,在小数点之前至少有两个数字。你只是改变了我应该想的方式,使它成为完美的解决方案:([1-9])[[09] { 2 }),这里[1-9]是第一个匹配,对于十进制,你添加了点(.),并用反SLASH()逃出,所以它应该被认为是正常字符,{ 2 }用于下两个小数。所以从00到99。但为什么是最后一个点,为什么你逃避了它?我只是不能把这部分和我的问题联系起来。你能解释一下吗。谢谢。是的,它将匹配<代码> 00。< /代码>,但是我不认为这是一个有效的格式来考虑(不必要的前导零)。它只表示小数点前的1-9或小数点前的两位数。假设前导数字是一个没有前导零的有效数字。注意,这也不会捕获3个或更多的数字。我编辑以包含它们。@ccf我理解,我只是试图解释regext检查是否等于大于1的regex。翻译为:如果是个位数,则应为1或更多;或者,小数点前至少有两位数字。