Awk 如何使用bash脚本提取连续模式

Awk 如何使用bash脚本提取连续模式,awk,sed,grep,Awk,Sed,Grep,我尝试了awk、grep和sed按照下面的输出解析连续模式,但结果为空。只有这两种模式中的任何一种起作用 awk'/^[0-9]/&&&/OAA-/'file.txt和grep-E'^[0-9].*ORA-'file.txt 下面的输入 2021-04-27T05:30:13.292507-04:00 OCC(3): OCC(3):DB initialized. OAA-06512: at "PATCH", line 001 2021-

我尝试了awk、grep和sed按照下面的输出解析连续模式,但结果为空。只有这两种模式中的任何一种起作用

awk'/^[0-9]/&&&/OAA-/'file.txt
grep-E'^[0-9].*ORA-'file.txt

下面的输入

    2021-04-27T05:30:13.292507-04:00
    OCC(3):
    OCC(3):DB initialized.
    OAA-06512: at "PATCH", line 001
    2021-05-27T05:30:13.292507-04:00
    OAA-06513: at "PATCH", line 002
    OAA-06514: at "PATCH", line 003
    2021-06-27T05:30:13.292507-04:00
    This is the empty string.
预期产量

2021-04-27T05:30:13.292507-04:00
OAA-06512: at "PATCH", line 001

2021-05-27T05:30:13.292507-04:00
OAA-06513: at "PATCH", line 002
OAA-06514: at "PATCH", line 003

可以提供语法来根据预期的输出分析连续模式,如Date后跟OAA注释。

对于显示的尝试/示例,请尝试一次,尝试在此处修复OP的尝试

awk 'sub(/^ +/,"") && /^([0-9]|OAA-)/' Input_file

这里只需编辑OP检查的条件。检查条件,如果行从数字或OAA开始,则打印该行。

对于所显示的尝试/示例,请尝试以下一次,尝试在此处修复OP的尝试

awk 'sub(/^ +/,"") && /^([0-9]|OAA-)/' Input_file

这里只需编辑OP检查的条件。检查条件,如果行从数字或OAA开始,则打印该行。

对于您发布的示例,您不需要对任何您可以执行的操作进行grep:

$ awk -v RS= -F'\n' '{print $1 ORS $NF}' file
2021-04-27T05:30:13.292507-04:00
OAA-06512: at "PATCH", line 001
2021-05-27T05:30:13.292507-04:00
OAA-06513: at "PATCH", line 002

如果这还不是你所需要的全部,那么编辑你的问题,提供一个更好的例子,包括那些不起作用的例子。

对于你发布的例子,你不需要对任何你可以做的事情进行grep:

$ awk -v RS= -F'\n' '{print $1 ORS $NF}' file
2021-04-27T05:30:13.292507-04:00
OAA-06512: at "PATCH", line 001
2021-05-27T05:30:13.292507-04:00
OAA-06513: at "PATCH", line 002
如果这还不是你所需要的,那么编辑你的问题,提供一个更好的例子,包括那些不起作用的情况。

你应该使用“或”,而不是“和”:
awk'/^[0-9]/| |/^OAA/”输入文件

这将匹配以数字或字符串“OAA”开头的行

您显示的文件摘要非常小,但是如果行都像您的示例一样,一个简单的
grep-v OCC输入文件可以做到这一点,但是它可能不会产生预期的输出。

您应该使用“or”,而不是“and”:
awk'/^[0-9]/| |/^OAA/”输入文件

这将匹配以数字或字符串“OAA”开头的行


您显示的文件的摘录非常小,但是如果这些行都像您的示例一样,一个简单的
grep-v OCC输入文件可以做到这一点,但是它可能不会产生预期的输出。

我倾向于使用perl regex语法和grep一起运行,因为我发现这很容易

grep -P '(?:^\d|^OAA-)' file.txt

因此,我们在file.txt中搜索以数字开头的行或以wtih OAA开头的行。“(?”表示非捕获组的开始,因为我们希望使用OR字符“|”,并用后面的括号括起来。”

我倾向于使用带有grep的perl regex语法运行,因为我发现这很容易

grep -P '(?:^\d|^OAA-)' file.txt

因此,我们在file.txt中搜索以数字开头的行或以wtih OAA开头的行。“(?”

awk'/^OAA-/{if(dt)print“\n”dt;print;dt=”“}/[0-9]{4}-/{dt=$0}”文件
2021-04-27T05:30:13.292507-04:00
OAA-06512:在“补丁”处,第001行
2021-05-27T05:30:13.292507-04:00
OAA-06513:在“补丁”处,第002行

您可以使用此
awk

awk'/^OAA-/{if(dt)print“\n”dt;print;dt=”“}/[0-9]{4}-/{dt=$0}”文件
2021-04-27T05:30:13.292507-04:00
OAA-06512:在“补丁”处,第001行
2021-05-27T05:30:13.292507-04:00
OAA-06513:在“补丁”处,第002行


也许
grep-E'^([0-9]| OAA-”file.txt
可以吗?@DevopsDevelop:tware(您的awk和grep)模式搜索以数字开头的行,并在某处具有字符串OAA。我看不出这与您的预期输出如何匹配。@WiktorStribiżew,谢谢您的更新。我已经编辑了输入文件的内容。预期输出仅为时间戳和以OAA-开头的行。您的代码解析所有的时间戳。@DevopsDevelop,您显示的输入示例中的空格是否真的存在于您的输入文件中?请确认一次?您最近的编辑完全更改了您的输入和输出格式。现在发布的内容是否100%准确,包括每个输入行开头的空格?也许
grep-E'^([0-9]| OAA-”file.txt
可以吗?@DevopsDevelop:tware(您的awk和grep)模式搜索以数字开头的行,并在某处包含字符串OAA。我看不出这与您的预期输出如何匹配。@WiktorStribiżew,谢谢您的更新。我已经编辑了输入文件的内容。预期输出仅为时间戳和以OAA-开头的行。您的代码解析所有的时间戳。@DevopsDevelop,您显示的输入示例中的空格是否真的存在于您的输入文件中?请确认一次?您最近的编辑完全更改了您的输入和输出格式。现在发布的内容是否100%准确,包括每个输入行开头的空格?用awk回答问题会导致更多问题=)@CalvinTaylor不确定你的陈述来自何方。你心中是否有一个特定的问题是对awk的基本理解或几分钟阅读awk手册页无法回答的?用awk回答一个问题会导致更多的问题=)@CalvinTaylor不确定你的陈述来自何方。您是否有一个特定的问题,对awk的基本理解或几分钟阅读awk手册页都无法回答?您好,更新了上面的输入文件。您的代码解析所有的时间戳。使用OAA-sequence解析时间戳但删除其他文件内容的任何语法。输入和预期输出已更新。请验证。@DevopsDevelop,请尝试一下
awk'sub(/^+/,“”)和&/^([0-9]| OAA-/)Input_文件
,并告诉我这是否有帮助?Ravi,语法错误,子函数打印空值。@DevopsDevelop,这是一个经过测试的命令,请告诉我您在这里遇到了什么错误?Hiya,更新了上面的输入文件。您的代码解析所有的时间戳。使用OAA-sequence解析时间戳但删除其他文件内容的任何语法。输入和预期输出已更新。碘化钾