gpt4 book ai didi

unix - 搜索行中的第一项,然后打印行和下一行

转载 作者:行者123 更新时间:2023-12-04 05:21:21 26 4
gpt4 key购买 nike

我正在尝试在文件中搜索名称,然后打印以下行。我最初是这样解决的:
grep -A 1 "searchterm" filename
但是,这会在行中的任何地方搜索 searchterm;这是一个问题,因为我只想要该行的第一部分匹配。

例如,如果我在以下文件中查找 1234:

4567 otherstuff 1234
wrongsecondline
1234 otherstuff
rightsecondline

当我真的想要 4567 otherstuff 1234wrongsecondline 时,它​​会找到 1234 otherstuffrightsecondline

关于如何只搜索一行中的第一项,然后打印该行和第二行的任何想法?谢谢!

最佳答案

使用 grep 打印匹配行和以下行:

$ egrep -w -A1 "^1234" filename
1234 otherstuff
rightsecondline

使用 awk 实现与上面相同的†:
$ awk '$1=="1234"{print;getline;print}' filename
1234 otherstuff
rightsecondline

使用 grep 仅打印匹配后的行(注意 < 之前的 filename ):
$ grep -w -H --label=dummy -A1 '^1234' <filename | sed -ne 's#^dummy-##p'
rightsecondline

使用 awk 实现与上面相同的†:
$ awk '$1=="1234"{getline;print}' filename
rightsecondline

† 前提是没有连续两行包含搜索词,并且文件中的最后一行不包含搜索词

如果您希望两个或多个连续行包含搜索词,例如
4567 otherstuff 1234
wrongsecondline
1234 otherstuff once
1234 otherstuff again
rightsecondline

...然后有状态地使用 awk 来实现与 grep -A1 相同的输出:
$ awk 'pr_after{print;pr_after=0}$1=="1234"{print;pr_after=1}' filename
1234 otherstuff once
1234 otherstuff again
rightsecondline

...并有状态地使用 awk 始终打印匹配项后的行,即使该行本身是匹配项:
$ awk 'pr_after{print;pr_after=0}$1=="1234"{pr_after=1}' filename
1234 otherstuff again
rightsecondline

...或者有状态地使用 awk 只打印紧跟在一个或多个匹配行之后的非匹配行,实现与上面的 grep -H | sed 相同的输出:
$ awk '$1=="1234"{pr_after=1;next}pr_after{print;pr_after=0}' filename
rightsecondline

在上面的例子中, $1=="1234"{...} 是一个 pattern/action rule,这意味着如果第一列等于文本 1234 那么 do ..., pr_after{...} 意味着如果变量 pr_after 被设置为某个非零非空值,那么 do ..., getline 意味着读取下一行并继续执行 getline 之后的语句,而 next 表示读取下一行并在第一个模式处重新开始计算。

关于unix - 搜索行中的第一项,然后打印行和下一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13656115/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com