在特定位置的单词后获取文本

时间:2019-01-14 05:51:32

标签: linux awk grep

我有这样的文件

TT;12-11-18;text;abc;def;word
AA;12-11-18;tee;abc;def;gih;word
TA;12-11-18;teet abc;def;word
TT;12-11-18;tdd;abc;def;gih;jkl;word

我想要这样的输出

TT;12-11-18;text;abc;def;word
TA;12-11-18;teet abc;def;word

如果word出现在日期12-11-18之后的第5位,我想得到它。如果在此位置位于第六或第七位置之后发现它,我不希望发生这种情况。从日期12-11-18开始的位置计数 我想试试这个命令

cat file.txt|grep "word" -n1

此命令将打印所有与此模式word相匹配的事件。我应该如何解决我的问题?

1 个答案:

答案 0 :(得分:1)

尝试一下(GNU awk):

awk -F"[; ]" '/12-11-18/ && $6=="word"' file

sed一个:

sed -n '/12-11-18;\([^; ]*[; ]\)\{3\}word/p' file

或具有基本相同的正则表达式(不同的转义符)的grep:

grep -E "12-11-18;([^; ]*[; ]){3}word" file

[^; ]表示不是;(空格)的任何字符。
*表示匹配先前字符/组的任何重复。
-[^; ]*表示任何不包含;或空格的长度字符串,^中的[^; ]将取反。

[; ]表示;或空格,一个出现。
()是将上述内容归为一类。
{3}用于匹配原作者/小组的三个重复项。

总体上,([^; ]*[; ]){3}表示; /由空格分隔的三个字段,其中包括定界符。

正如@kvantour指出的那样,如果一个地方可能有多个空格,则可能是错误的。
要将多个空格视为一个分隔符,然后:

awk -F"(;| +)" '/12-11-18/ && $6=="word"'

grep -E "12-11-18;([^; ]*(;| +)){3}word"

或GNU sed(posix / bsd / osx sed不支持|):

sed -rn '/12-11-18;([^; ]*(;| +)){3}word/p'