如果Line匹配字符串之后的任何内容,则执行命令

时间:2016-09-14 17:13:32

标签: linux bash if-statement awk grep

我对grep,cut,sed等相当不错。但是,我很难从文件中提取这些数据。它看起来像这样:

--timestamp--  data://example1// -----| This could be anything or nothing
--timestamp--  data://example2// -----|     This could be something
--timestamp--  data://example3// -----| 
--timestamp--  data://example4// -----|      This could something else
--timestamp--  data://example5// -----| This could be another something
--timestamp--  data://example6// -----| 
--timestamp--  data://example7// -----|       This could something else

我想返回字符串-----|后面有任何内容的所有行,所以输出结果为:

example1
example2
example4
example5
example7

我知道我需要使用基于grep '-----|.*$'匹配的IF语句。如果字符串后面有任何字符,则输出该行。然后,我可以输出一个awk命令,该命令将在示例之前和之后的分隔符//之间进行提取。我只是坚持如何构造if语句。

非常感谢您对此IF声明的任何帮助。

5 个答案:

答案 0 :(得分:1)

您可以使用awk使用//作为字段分隔符来执行此操作并打印第二个字段:

awk -F'//' '/-{5}\|[ \t]*[^ \t]/{print $2}' file

example1
example2
example4
example5
example7

正则表达式:/-{5}\|[ \t]*[^ \t]/搜索五个虚线后跟一个文字管道,后跟0个或更多的空格,然后是非空白字符。

您还可以使用POSIX类[[:blank:]]来匹配空格或制表符:

awk -F'//' '/-{5}\|[[:blank:]]*[^[:blank:]]/{print $2}' file

答案 1 :(得分:1)

我会用一个grep

来做
grep -oP '[^/]*(?=// -----\| .+$)' input.txt

example1
example2
example4
example5
example7

这个想法是从/一直到行尾的文本开始匹配。我使用-o标志,它只返回每行的匹配部分。这与前瞻(即(?=...)部分)很好地配合,后者与其中的模式匹配,但不包括输出中的匹配文本。

答案 2 :(得分:1)

$ awk -F'/' '!/\|$/{print $3}' file
example1
example2
example4
example5
example7

如果您想在/\|[[:blank:]]*$/之后处理空白,请将条件设为|,就好像它们不存在一样。

请注意,这种方法会失败,如下所示:

--timestamp--  data://example1// -----| "anything" includes |

如果发生这种情况,请将其包含在您的示例中。您可以将条件更改为匹配-----|,也可以更改为"任何":

--timestamp--  data://example1// -----| "anything" includes -----|

因此仍可能导致失败。只需准确,真实地代表您的样本输入/输出,并包括最坏情况,而不仅仅是晴天的情况。

答案 3 :(得分:0)

在您的示例数据中,|后面有空格(或者只是复制的神器)。如果这些不是真的存在,只需将模式更改为匹配/\| .+$//\|.+$/ - 删除空格。

这匹配' |之后没有任何内容的所有行'组合:

$ awk -F/ '!/\| .+$/ {print $3}' < t
example3
example6

这匹配了&#39; |之后的所有行&#39;组合:

$awk -F/ '/\| .+$/ {print $3}' < t
example1
example2
example4
example5
example7

答案 4 :(得分:0)

这是另一个awk

$ awk -F'-----\\|' '$2~/[^ ]+$/{n=split($1,a,"//"); print a[n-1]}' file

example1
example2
example4
example5
example7

这会处理额外的分隔符。