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

B.M*_*.W. 31 bash awk grep sed

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

文件1:

http://www.google.com
http://www.bing.com
http://www.yahoo.com
http://www.baidu.com
http://www.yandex.com
....
Run Code Online (Sandbox Code Playgroud)

我希望获得以下所有记录:http://www.yahoo.com,结果如下所示:

文件2:

http://www.baidu.com
http://www.yandex.com
....
Run Code Online (Sandbox Code Playgroud)

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

$grep -n 'http://www.yahoo.com' file1
3 http://www.yahoo.com
Run Code Online (Sandbox Code Playgroud)

但是我不知道如何在第3行之后获取文件.另外,我知道grep中有一个标志 - 在匹配后打印行.但是,您需要在匹配后指定所需的行数.我想知道是否有什么可以解决这个问题.喜欢:

PSEUDO CODE:
$ grep -n 'http://www.yahoo.com' -A all file1 > file2 
Run Code Online (Sandbox Code Playgroud)

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

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

Hai*_* Vu 46

AWK

如果你不介意使用awk:

awk '/yahoo/{y=1;next}y' data.txt
Run Code Online (Sandbox Code Playgroud)

该脚本包含两部分:

/yahoo/ { y = 1; next }
y
Run Code Online (Sandbox Code Playgroud)

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

第二部分是:

y != 0 { print }
Run Code Online (Sandbox Code Playgroud)

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

桑达

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

sed '1,/yahoo/d' data.txt 
Run Code Online (Sandbox Code Playgroud)


zwo*_*wol 13

sed比使用起来容易得多grep. sed可以将任何单字母命令应用于包含范围的行; 这个的一般语法是

START , STOP COMMAND
Run Code Online (Sandbox Code Playgroud)

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

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

sed -n -e '/http:\/\/www\.yahoo\.com/,$p' file1 > file2
Run Code Online (Sandbox Code Playgroud)

-n意思是"不打印任何东西,除非特别告知",而-e指令是指"从行正则表达式匹配的首次出现/http:\/\/www\.yahoo\.com/在文件的结尾,pRINT."

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

sed -e '1,/http:\/\/www\.yahoo\.com/d' file1 > file2
Run Code Online (Sandbox Code Playgroud)

这意味着"为线1通过匹配正则表达式的第一行/http:\/\/www\.yahoo\.com/,delete行"(然后,隐式,打印一切;请注意,-n使用该时间).

  • @7stud 如果你这样做,它就行不通。好吧,我想现代实现可能已经放宽了语法,但是在 *传统* Unix 版本 7 实现中,地址和命令之间不允许有空格。 (2认同)

小智 7

awk '/yahoo/ ? c++ : c' file1
Run Code Online (Sandbox Code Playgroud)

或者打高尔夫球

awk '/yahoo/?c++:c' file1
Run Code Online (Sandbox Code Playgroud)

结果

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