This question already has answers here:
How to get the part of a file after the first line that matches a regular expression?

(12个答案)


4年前关闭。




嗨,我有一个包含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在您的匹配项后打印行。但是,您需要指定匹配后要多少行。我想知道该问题是否可以解决。喜欢:
PSEUDO CODE:
$ grep -n 'http://www.yahoo.com' -A all file1 > file2

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

期待方便和简单的解决方案。
随意批评我从一开始就使问题复杂化,也欢迎awk和sed命令!

最佳答案

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:匹配后打印所有内容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18166552/

10-15 12:19