我对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声明的任何帮助。
答案 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
这会处理额外的分隔符。