bash - 'grep +A' : print everything after a match

标签 bash sed awk grep

<分区>

我有一个包含 URL 列表的文件。如下所示:

文件1:

http://www.google.com
http://www.bing.com
http://www.yahoo.com
http://www.baidu.com
http://www.yandex.com
....

我想获取所有记录:http://www.yahoo.com ,结果如下所示:

文件2:

http://www.baidu.com
http://www.yandex.com
....

我知道我可以使用 grep 找到 yahoo.com 所在的行号

grep -n 'http://www.yahoo.com' file1

3 http://www.yahoo.com

但我不知道如何在第 3 行之后获取文件。此外,我知道 grep -A 中有一个标志,在匹配后打印行。但是,您需要指定匹配后需要多少行。我想知道有什么办法可以解决这个问题。喜欢:

Pseudocode:

grep -n 'http://www.yahoo.com' -A all file1 > file2

我知道我们可以使用我得到的行号和 wc -l 来获取 yahoo.com 之后的行数,但是......感觉很蹩脚。

最佳答案

AWK

如果你不介意使用 AWK :

awk '/yahoo/{y=1;next}y' data.txt

这个脚本有两部分:

/yahoo/ { y = 1; next }
y

第一部分指出,如果遇到带有 yahoo 的行,我们设置变量 y=1,然后跳过该行(next 命令将跳转到下一行,因此跳过当前行的任何进一步处理)。如果没有 next 命令,将打印 yahoo 行。

第二部分是以下内容的简写:

y != 0 { print }

这意味着,对于每一行,如果变量 y 不为零,我们将打印该行。在 AWK 中,如果您引用一个变量,该变量将被创建,并且该变量是零或空字符串,具体取决于上下文。在遇到 yahoo 之前,变量 y 为 0,因此脚本不会打印任何内容。遇到yahoo后,y为1,所以之后的每一行都会打印。

种子

或者,使用 sed,以下将删除所有内容,包括带有 yahoo 的行:

sed '1,/yahoo/d' data.txt

关于bash - 'grep +A' : print everything after a match,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18166552/

相关文章:

linux - 如何删除 shell bash linux 中的连续空格?

linux - "read"命令在 bash 中不弹出输入窗口(在没有终端的情况下运行)

bash - 如何在Linux中从PowerShell Core执行Bash脚本

linux - Awk 与 Awk + ​​cut 与 bash

sed - 根据另一个文件从一个文件中删除特定行

bash - Easy Bash if-else

bash - 如何删除匹配行前后的 1 行,以及匹配行本身?

linux - 如何操作文本行并为奇数和偶数创建两个单独的文件

regex - 打印文件中pattern1和pattern2之间的数据,而不打印pattern2

for-loop - 将连续数字附加到文件名