如何在模式之后grep第一次出现的单词

时间:2018-01-30 04:59:12

标签: search grep

我有一个分析的输出,我想grep一个关键字“X” - 它总是出现 - 每次出现短语“Y”。关键字“X”出现多次,但我想只获得“Y”之后的后续内容。

例如,我希望每次Iter = 10时都会得到后续的文件夹名称,即F1,F4。

Iter   = 10
Folder = F1

Iter   = 5
Folder = F2

Iter   = 6
Folder = F3

Iter   = 10
Folder = F4

有什么想法吗?

文件的Hexdump -c输出(由@Inian请求):

0000000   I   t   e   r               =       1   0  \n   F   o   l   d
0000010   e   r       =       F   1  \n  \n   I   t   e   r            
0000020   =       5  \n   F   o   l   d   e   r       =       F   2  \n
0000030  \n   I   t   e   r               =       6  \n   F   o   l   d
0000040   e   r       =       F   3  \n  \n   I   t   e   r            
0000050   =       1   0  \n   F   o   l   d   e   r       =       F   4
0000060  \n                                                            
0000061

3 个答案:

答案 0 :(得分:3)

您可以使用//Return true if the user by url is blocked, false otherwise function isblocked(blocked_id) { var blocked_users = [];//The list of blocked users chrome.storage.sync.get(['blocked_users'], function(data){ blocked_users = data.blocked_users; }); console.log("U" + blocked_users + "U"); //Goes through blocked users for(var current_blocked of blocked_users) { console.log("B"+current_blocked+"B"); if(current_blocked == blocked_id) return true;//If the user is blocked } console.log(blocked_users+"QQ"); return false; } 来满足此要求。它适用于输入文件每一行的基于awk的规则。所以在我们的例子中,我们首先匹配字符串/pattern/{action}并启用一个标志,以便在以Iter = 10开头的字符串的下一个匹配时,我们提取最后一个空间限制列,其在{{1由Folder表示,我们重置后续匹配的标志。

awk

或没有$NF尝试

awk '/\<Iter   = 10\>/{flag=1; next} flag && /^Folder/{print $NF; flag=0;}' file

答案 1 :(得分:1)

你也可以grep

$ grep -A 1 Iter.*10 file | grep Folder | grep -o "[^ ]*$"
F1
F4

说明:

  • grep -A 1 Iter.*10 file搜索所需的模式并获取一些尾随上下文(-A 1,只有一行)
  • grep Folder下次搜索关键字Folder
  • grep -o "[^ ]*$"获取上一个输出的最后一部分

如果IterFolder行之间存在噪音,您可以先将grep "\(Iter.*10\|Folder\)" file删除。

以上预计Iter行会出现在Folder行之前。如果不是这样,awk就是治愈方法。例如,数据(行顺序不同,有噪音):

Folder = F1
Foo    = bar
Iter   = 10

Iter   = 5
Foo    = bar
Folder = F2

$ awk -v RS="" -F"\n" '                        # record separated by empty line
/Iter/ && / 10$/ {                             # look for record with Iter 10
    for(i=1;i<=NF;i++)                         # iterate all fields (lines within record)
        if(split($i,a," *") && a[1]=="Folder") # split Folder line to components
            print a[3]                         # output value
}
' file
F1

答案 2 :(得分:0)

grep只是regrex搜索。

对于更复杂的操作,您可以使用awk

E.g。

awk '/Iter = 10/ { getline; print $0 }' /path/to/file

其中/ path / to / file是包含要搜索的文本的文件

编辑: 在发布我的答案后,我读了Inian的答案,它更加精细和准确。