34

我有一个包含 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 之后的行数,但是……感觉很蹩脚。

4

5 回答 5

57

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
于 2013-08-10T21:43:32.127 回答
13

sedgrep. sed可以将其任何单字母命令应用于包含范围的行;通用语法是

START , STOP COMMAND

除了没有任何空格。 START并且STOP每个都可以是一个数字(意思是“行号N”,从1开始);一个美元符号(意思是“文件的结尾”),或者一个用斜杠括起来的正则表达式,意思是“与这个正则表达式匹配的第一行”。(确切的规则稍微复杂一些;GNUsed手册有更多细节。)

所以,你可以像这样做你想做的事:

sed -n -e '/http:\/\/www\.yahoo\.com/,$p' file1 > file2

意思是“-n除非特别告知,否则不要打印任何东西”,-e指令的意思是“从与正则表达式匹配的行的第一次出现/http:\/\/www\.yahoo\.com/到文件末尾,print”。

这将在输出中包含上面的行http://www.yahoo.com/。如果您想要该点之后的所有内容而不是该行本身,那么最简单的方法是反转操作:

sed -e '1,/http:\/\/www\.yahoo\.com/d' file1 > file2

这意味着“对于第 1 行到与 regexp 匹配的第一行/http:\/\/www\.yahoo\.com/d删除该行”(然后,隐式地打印其他所有内容;注意这次-n使用)。

于 2013-08-10T21:41:16.490 回答
7
awk '/yahoo/ ? c++ : c' file1

或打高尔夫球

awk '/yahoo/?c++:c' file1

结果

http://www.baidu.com
http://www.yandex.com
于 2014-06-01T21:54:28.897 回答
3

这在 Perl 中最容易做到:

perl -ne 'print unless 1 .. m(http://www\.yahoo\.com)' file

换句话说,打印不在第 1 行和该模式第一次出现之间的所有

于 2013-08-10T23:11:04.843 回答
2

使用此脚本:

# Get index of the "yahoo" word
index=`grep -n "yahoo" filepath | cut -d':' -f1`

# Get the total number of lines in the file
totallines=`wc -l filepath | cut -d' ' -f1`

# Subtract totallines with index
result=`expr $total - $index`

# Gives the desired output
grep -A $result "yahoo" filepath
于 2013-08-13T04:55:57.573 回答