grep + A:匹配后打印所有内容

时间:2013-08-10 21:31:42

标签: bash sed awk grep

您好我有一个包含网址列表的文件,如下所示:

文件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之后得到所有记录,结果如下所示:

file2的:

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中有一个标志 - 在匹配后打印行。但是,您需要在匹配后指定所需的行数。我想知道是否有什么可以解决这个问题。像:

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

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

期待一个方便易用的解决方案。 请尽量批评我在开始时将问题复杂化,并且也欢迎使用awk和sed命令!

5 个答案:

答案 0 :(得分:42)

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 

答案 1 :(得分:12)

使用sedgrep更容易完成。 sed可以将任何单字母命令应用于包含范围的行;这个的一般语法是

START , STOP COMMAND

除了没有任何空格。 STARTSTOP每个都可以是一个数字(意思是“行号N”,从1开始);一个美元符号(意思是“文件的结尾”),或用斜杠括起来的正则表达式,意思是“匹配此正则表达式的第一行”。 (确切的规则稍微复杂一些; the GNU sed manual has more detail。)

所以,你可以做你想做的事情:

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

-n表示“除非明确告知”,否则“不打印任何内容”,-e指令意味着“从首次出现与正则表达式/http:\/\/www\.yahoo\.com/匹配的行文件末尾p rint。“

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

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

表示“对于第1行到匹配正则表达式/http:\/\/www\.yahoo\.com/的第一行,d选择该行”(然后,隐式地,打印其他所有内容;请注意-n是< em> not 这次使用了。)

答案 2 :(得分:7)

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

或打高尔夫球

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

结果

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

答案 3 :(得分:3)

这在Perl中最容易完成:

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

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

答案 4 :(得分:2)

使用脚本

#get index of yahoo word
index=`grep -n "yahoo" filepath | cut -d':' -f1`
#get total number of lines in 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